深入淺出Hibernate P281講到使用Hibernate3的Bulk delete/update方式刪除記錄時,寫了段代碼證明這種刪除方式不能緩存同步,會從緩存中讀取出數據庫已經刪除的信息,我依葫蘆畫瓢寫了段代碼,結果與書上結論相反,
請大家幫我看看到底怎么回事,我用的hibernate3.0,代碼如下:
package mypack;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import sessionfactory.HibernateSessionFactory;
public class test2 {
?/**
? * @param args
? */
?public static void main(String[] args) {
? //儲存插入記錄的id
??int insertid;
??//新建實例
??TUser insertuser = new TUser();
??insertuser.setName("name1");
??insertuser.setResume("resume1");
??//插入實例
??Session session = HibernateSessionFactory.getSession();
??Transaction tx = session.beginTransaction();??
??session.save(insertuser);
??insertid = insertuser.getId();
??tx.commit();
??session.close();
??
??// 裝載插入的實例
??session = HibernateSessionFactory.getSession();
??TUser user = (TUser) session.load(TUser.class, new Integer(insertid));
??System.out.println("裝載實例成功,id==>" + user.getId());
??tx = session.beginTransaction();
??// 刪除插入的實例
??String hql = "delete TUser where id = "+insertid;
??Query query = session.createQuery(hql);
??query.executeUpdate();
??tx.commit();
??// 讀取刪除的實例,拋出異常
??user = (TUser) session.load(TUser.class, new Integer(insertid));
??System.out.println("讀取緩存中存放的id成功, id==>" + user.getId());
??// 捕捉異常
??try {
???System.out.println(user.getName());
??} catch (org.hibernate.ObjectNotFoundException e) {
???System.out.println("代碼user.getname()發生異常,因為該實例已經被刪除");
???System.out.println(e.toString());
???System.out.println("結論:Query.execxuteUpdate()方法刪除數據是緩存同步的");
??}
??session.close();
?}
}
打印信息如下:
Hibernate: insert into tuser (name, resume) values (?, ?)
裝載實例成功,id==>43
Hibernate: delete from tuser where id=43
讀取緩存中存放的id成功, id==>43
Hibernate: select tuser0_.id as id0_, tuser0_.name as name0_0_, tuser0_.resume as resume0_0_ from tuser tuser0_ where tuser0_.id=?
代碼user.getname()發生異常,因為該實例已經被刪除
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [mypack.TUser#43]
結論:Query.execxuteUpdate()方法刪除數據是緩存同步的