Hibernate學習筆記 - Session.evict(user)方法
瀏覽(9)|評論(0) 交流分類:Java|筆記分類: 未分類
作用:從session緩存(EntityEntries屬性)中逐出該對象
java代碼:
- 但是與commit同時使用,會拋出異常
- session = HibernateUtils.getSession();
- tx = session.beginTransaction();
- User1 user = new User1();
- user.setName("李四");
- user.setPassword("123");
- user.setCreateTime(new Date());
- user.setExpireTime(new Date());
- //利用Hibernate將實體類對象保存到數據庫中
- //因為user主鍵生成策略采用的是uuid,所以調用完成save后,只是將user納入session的管理
- //不會發出insert語句,但是id已經生成,session中的existsInDatabase狀態為false
- session.save(user);
- session.evict(user);//從session緩存(EntityEntries屬性)中逐出該對象
- //無法成功提交,因為hibernate在清理緩存時,在session的臨時集合(insertions)中取出user對象進行insert操作后需要更新entityEntries屬性中的existsInDatabase為true,而我們采用evict已經將user從session中逐出了,所以找不到相關數據,無法更新,拋出異常。
- tx.commit();
- 解決在逐出session緩存中的對象不拋出異常的方法:
- 在session.evict()之前進行顯示的調用session.flush()方法就可以了。
- //利用Hibernate將實體類對象保存到數據庫中
- //因為user主鍵生成策略采用的是uuid,所以調用完成save后,只是將user納入session的管理
- //不會發出insert語句,但是id已經生成,session中的existsInDatabase狀態為false
- session.save(user);
- //flush后hibernate會清理緩存,會將user對象保存到數據庫中,將session中的insertions中的user對象清除,並且會設置session中的existsInDatabase狀態為false
- session.flush();
- session.evict(user);//從session緩存(EntityEntries屬性)中逐出該對象
- //可以成功提交,因為hibernate在清理緩存時,在Session的insertions中集合中無法找到user對象所以不會發出insert語句,也不會更新session中existsInDatabase的狀態。
- tx.commit();
但是與commit同時使用,會拋出異常 session = HibernateUtils.getSession(); tx = session.beginTransaction(); User1 user = new User1(); user.setName("李四"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //利用Hibernate將實體類對象保存到數據庫中 //因為user主鍵生成策略采用的是uuid,所以調用完成save后,只是將user納入session的管理 //不會發出insert語句,但是id已經生成,session中的existsInDatabase狀態為false session.save(user); session.evict(user);//從session緩存(EntityEntries屬性)中逐出該對象 //無法成功提交,因為hibernate在清理緩存時,在session的臨時集合(insertions)中取出user對象進行insert操作后需要更新entityEntries屬性中的existsInDatabase為true,而我們采用evict已經將user從session中逐出了,所以找不到相關數據,無法更新,拋出異常。 tx.commit(); 解決在逐出session緩存中的對象不拋出異常的方法: 在session.evict()之前進行顯示的調用session.flush()方法就可以了。 //利用Hibernate將實體類對象保存到數據庫中 //因為user主鍵生成策略采用的是uuid,所以調用完成save后,只是將user納入session的管理 //不會發出insert語句,但是id已經生成,session中的existsInDatabase狀態為false session.save(user); //flush后hibernate會清理緩存,會將user對象保存到數據庫中,將session中的insertions中的user對象清除,並且會設置session中的existsInDatabase狀態為false session.flush(); session.evict(user);//從session緩存(EntityEntries屬性)中逐出該對象 //可以成功提交,因為hibernate在清理緩存時,在Session的insertions中集合中無法找到user對象所以不會發出insert語句,也不會更新session中existsInDatabase的狀態。 tx.commit();