陈靓仔 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 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记