陈靓仔 2014-05-23 14:48 采纳率: 100%
浏览 867

关于Hibernate3很难很难的问题!求解!

对比两个例子:

 ......
        Transaction transaction = hbSession.getTransaction();
        transaction.begin();
        TFood tf2 = (TFood) hbSession.load(TFood.class, 4); 
         System.out.println(tf2);  
        tf2.setGname("IPhone 4s");
        transaction.commit();

这样会发送一条update语句更新数据库,但是这样:

......
    Transaction transaction = hbSession.getTransaction();
    TFood tf2 = (TFood) hbSession.load(TFood.class, 4); 
     System.out.println(tf2); 
    try {   
      Thread.sleep(10000);//延迟10秒,这段时间到数据库中删除id为4的记录。   } 
    catch (InterruptedException e) {   
      e.printStackTrace();  
     } 
     tf2.setGname("IPhone 4ssssss");
    transaction.commit();
10秒内我把数据库中的记录删掉,期间程序一直运行,10秒后运行到commit,这时不会发送update语句。Hibernate知道我把数据库中的记录删了吗?为什么不发送update语句然后抛出异常,这才是应该发生的情况吧?

还有一个问题:我在使用delete方法时看到有人说:
delete()方法用于从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划执行一个delete语句。如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。值得注意的是,Session只有在清理缓存的时候的才执行delete语句。 此外,只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。 原文地址:http://developer.51cto.com/art/200906/131951.htm
最后一句说:session在close时才会从缓存中删除该对象。
但是本人试了一下:

 ...
    Session hbSession = baseHibernateDAO.getSession();
    transaction.begin();
    TFood f5=(TFood)hbSession.load(TFood.class, 3);
    hbSession.delete(f5);
    TFood f6=(TFood)hbSession.load(TFood.class, 3);//第二次获取,load先从缓存中获取
    System.out.println(f6.getXXX);
    transaction.commit();

这样会抛出ObjectNotFindException异常。为什么第二次直接从缓存中获取无法获取对象?

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 spring后端vue前端
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题