对比两个例子:
......
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异常。为什么第二次直接从缓存中获取无法获取对象?