2 u010569227 u010569227 于 2014.05.23 22:48 提问

关于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异常。为什么第二次直接从缓存中获取无法获取对象?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!