session flush測(cè)試:
session flush方法主要做了兩件事:
1 清理緩存
2 執(zhí)行sql(不是提交事務(wù))
session在什么情況下執(zhí)行flush
1 默認(rèn)在事務(wù)提交時(shí)
2 顯式的調(diào)用flush
3 在執(zhí)行查詢前,如:iterate
hibernate按照save(insert),update,delete順序提交相關(guān)的操作
------------------------------------------------------------------------
<id name="id">
<generator class="uuid"/>
</id>
因?yàn)閕d的主鍵生成策略采用的是uuid,所以調(diào)用完save后,只是將user對(duì)象納入到session的管理
不會(huì)發(fā)出insert語(yǔ)句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false
session.save(user);
調(diào)用flush,hibernate會(huì)清理緩存,執(zhí)行sql
如果數(shù)據(jù)庫(kù)的隔離級(jí)別為提交讀,那么我們可以看到flush過(guò)的數(shù)據(jù)
并且session中existsInDatebase狀態(tài)變?yōu)閠rue
session.flush();
默認(rèn)情況下commit操作會(huì)先執(zhí)行者flush清理緩存,所以不用顯式的調(diào)用flush
commit后數(shù)據(jù)無(wú)法回滾
session.getTransaction().commit();
<id name="id">
<generator class="native"/>
</id>
如果id的主鍵生成策略采用的是native,調(diào)用save(user)時(shí)會(huì)發(fā)出insert語(yǔ)句,返回由數(shù)據(jù)庫(kù)生成的id,
user對(duì)象納入到session的管理,session中existsInDatebase狀態(tài)為true
-----------------------------------------------------------------
<id name="id">
<generator class="uuid"/>
</id>
session.save(user);
將user對(duì)象從session中逐出,即session的EntiryEntries屬性中逐出
session.evict(user);//清理緩存
無(wú)法成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中取出user對(duì)象進(jìn)行insert操作后
需要更新entityEntries屬性中的existsnDatabase為true,而我們采用evict已經(jīng)將user從session中
逐出了,所以找不到相關(guān)數(shù)據(jù),無(wú)法更新,拋出異常
session.getTransaction().commit();
----------------------------------------------------------------
<id name="id">
<generator class="uuid"/>
</id>
session.save(user);
flush后hibernate會(huì)清理緩存,會(huì)將user對(duì)象保存到數(shù)據(jù)庫(kù)中,將session中的insertions中的user
清除,并且設(shè)置session中existsInDatabase的狀態(tài)為true
session.flush(user);
將user對(duì)象從session中逐出,即session的EntityEntries屬性中逐出
session.evict(user);//清理緩存
可以成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中無(wú)法找到user對(duì)象
所以就不會(huì)發(fā)出insert語(yǔ)句,也不會(huì)更新session中的existsInDatabase的狀態(tài)
session.getTransaction().commit();
-----------------------------------------------------------------
<id name="id">
<generator class="native"/>
</id>
session.save(user);
將user對(duì)象從session中逐出,即session的EntityEntries屬性中逐出
session.evict(user);//清理緩存
可以成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中無(wú)法找到user對(duì)象
所以就不會(huì)發(fā)出insert語(yǔ)句,也不會(huì)更新session中的existsInDatabase的狀態(tài)
session.getTransaction().commit();
-----------------------------------------------------------------
<id name="id">
<generator class="assigned"/>
</id>
session.save(user);
user.setName("張三");
session.update(user);
User user2=new User();
user2.setId("003");
user2.setName("李四");
session.getTransaction().commit();
結(jié)果:
insert into ...
insert into ...
update t_user ...
hibernate按照save(insert),update,delete順序提交相關(guān)的操作
-----------------------------------------------------------------
<id name="id">
<generator class="assigned"/>
</id>
session.save(user);
user.setName("張三");
session.update(user);
因?yàn)槲覀冊(cè)趕ession.update(user)后執(zhí)行了flush,所以在以commit清理緩存時(shí)執(zhí)行flush前的sql就不會(huì)發(fā)出.
session.flush();//在這里flush操作就可以了
User user2=new User();
user2.setId("003");
user2.setName("李四");
session.getTransaction().commit();
結(jié)果:
insert into ...
update t_user ...
insert into ...
按照我們想要順序save(insert),update,save(insert)的順序提交操作
-----------------------------------------------------------------
posted on 2009-11-03 16:37
junly 閱讀(1224)
評(píng)論(1) 編輯 收藏 所屬分類:
hibernate/orm