陈靓仔 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 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
    • ¥15 如何在scanpy上做差异基因和通路富集?
    • ¥20 关于#硬件工程#的问题,请各位专家解答!
    • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?