Hibernate Session中的 flush方法的作用:
session flush方法主要做了兩件事:
* 清理緩存
* 執(zhí)行sql
session在什么情況下執(zhí)行flush
* 默認(rèn)在事務(wù)提交時(shí)
* 顯示的調(diào)用flush
* 在執(zhí)行查詢前,如:iterate
/**
* 測(cè)試uuid主鍵生成策略
*/
public void testSave1() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成策略采用的是uuid,所以調(diào)用完成save后,只是將user納入到了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í)別設(shè)置為為提交讀,那么我們可以看到flush過(guò)的數(shù)據(jù)
//并且session中existsInDatebase狀態(tài)為true
session.flush();
//提交事務(wù)
//默認(rèn)情況下commit操作會(huì)先執(zhí)行flush清理緩存,所以不用顯示的調(diào)用flush
//commit后數(shù)據(jù)是無(wú)法回滾的
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試native主鍵生成策略
*/
public void testSave2() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User2 user = new User2();
user.setName("張三1");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成策略為native,所以調(diào)用session.save后,將執(zhí)行insert語(yǔ)句,返回有數(shù)據(jù)庫(kù)生成的id
//納入了session的管理,修改了session中existsInDatebase狀態(tài)為true
//如果數(shù)據(jù)庫(kù)的隔離級(jí)別設(shè)置為為提交讀,那么我們可以看到save過(guò)的數(shù)據(jù)
session.save(user);
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試uuid主鍵生成策略
*/
public void testSave3() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("王五");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成側(cè)路采用的是uuid,所以調(diào)用完成save后,只是將user納入到了session的管理
//不會(huì)發(fā)出insert語(yǔ)句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false
session.save(user);
//將user對(duì)象從session中逐出,即session的EntityEntries屬性中逐出
session.evict(user);
//無(wú)法成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中取出user對(duì)象進(jìn)行insert操作后
//需要更新entityEntries屬性中的existsInDatabase為true,而我們采用evict已經(jīng)將user從session的entityEntries
//中逐出了,所以找不到相關(guān)數(shù)據(jù),無(wú)法更新,拋出異常
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試uuid主鍵生成策略
*/
public void testSave4() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("王五");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成側(cè)路采用的是uuid,所以調(diào)用完成save后,考試大提示只是將user納入到了session的管理
//不會(huì)發(fā)出insert語(yǔ)句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false
session.save(user);
//flush后hibernate會(huì)清理緩存,會(huì)將user對(duì)象保存到數(shù)據(jù)庫(kù)中,將session中的insertions中的user對(duì)象
//清除,并且設(shè)置session中existsInDatebase的狀態(tài)為true
session.flush();
//將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)
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試native主鍵生成策略
*/
public void testSave5() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User2 user = new User2();
user.setName("張三11");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成策略為native,所以調(diào)用session.save后,將執(zhí)行insert語(yǔ)句,返回有數(shù)據(jù)庫(kù)生成的id
//納入了session的管理,修改了session中existsInDatebase狀態(tài)為true
//如果數(shù)據(jù)庫(kù)的隔離級(jí)別設(shè)置為為提交讀,考試大提示可以看到save過(guò)的數(shù)據(jù)
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)
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
session flush方法主要做了兩件事:
* 清理緩存
* 執(zhí)行sql
session在什么情況下執(zhí)行flush
* 默認(rèn)在事務(wù)提交時(shí)
* 顯示的調(diào)用flush
* 在執(zhí)行查詢前,如:iterate
/**
* 測(cè)試uuid主鍵生成策略
*/
public void testSave1() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成策略采用的是uuid,所以調(diào)用完成save后,只是將user納入到了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í)別設(shè)置為為提交讀,那么我們可以看到flush過(guò)的數(shù)據(jù)
//并且session中existsInDatebase狀態(tài)為true
session.flush();
//提交事務(wù)
//默認(rèn)情況下commit操作會(huì)先執(zhí)行flush清理緩存,所以不用顯示的調(diào)用flush
//commit后數(shù)據(jù)是無(wú)法回滾的
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試native主鍵生成策略
*/
public void testSave2() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User2 user = new User2();
user.setName("張三1");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成策略為native,所以調(diào)用session.save后,將執(zhí)行insert語(yǔ)句,返回有數(shù)據(jù)庫(kù)生成的id
//納入了session的管理,修改了session中existsInDatebase狀態(tài)為true
//如果數(shù)據(jù)庫(kù)的隔離級(jí)別設(shè)置為為提交讀,那么我們可以看到save過(guò)的數(shù)據(jù)
session.save(user);
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試uuid主鍵生成策略
*/
public void testSave3() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("王五");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成側(cè)路采用的是uuid,所以調(diào)用完成save后,只是將user納入到了session的管理
//不會(huì)發(fā)出insert語(yǔ)句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false
session.save(user);
//將user對(duì)象從session中逐出,即session的EntityEntries屬性中逐出
session.evict(user);
//無(wú)法成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中取出user對(duì)象進(jìn)行insert操作后
//需要更新entityEntries屬性中的existsInDatabase為true,而我們采用evict已經(jīng)將user從session的entityEntries
//中逐出了,所以找不到相關(guān)數(shù)據(jù),無(wú)法更新,拋出異常
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試uuid主鍵生成策略
*/
public void testSave4() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("王五");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成側(cè)路采用的是uuid,所以調(diào)用完成save后,考試大提示只是將user納入到了session的管理
//不會(huì)發(fā)出insert語(yǔ)句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false
session.save(user);
//flush后hibernate會(huì)清理緩存,會(huì)將user對(duì)象保存到數(shù)據(jù)庫(kù)中,將session中的insertions中的user對(duì)象
//清除,并且設(shè)置session中existsInDatebase的狀態(tài)為true
session.flush();
//將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)
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 測(cè)試native主鍵生成策略
*/
public void testSave5() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User2 user = new User2();
user.setName("張三11");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//因?yàn)閡ser的主鍵生成策略為native,所以調(diào)用session.save后,將執(zhí)行insert語(yǔ)句,返回有數(shù)據(jù)庫(kù)生成的id
//納入了session的管理,修改了session中existsInDatebase狀態(tài)為true
//如果數(shù)據(jù)庫(kù)的隔離級(jí)別設(shè)置為為提交讀,考試大提示可以看到save過(guò)的數(shù)據(jù)
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)
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}