调用session.clear()
或者session.evict(obj)
皆无法清除Hibernate中的持久化状态的对象
目前已知的情况是:
当主键使用identify策略时,
session.save(person)
调用完成后会发出INSERT语句当主键使用increment策略时,不会发出INSERT语句,并且结果与预期一致
代码如下:
@Test
public void test1(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setName("tom888");
session.save(person); //此处是否发出**INSERT**语句与主键策略有关
session.evict(person);
// session.clear();
transaction.commit();
session.close();
}
主键使用identify策略时,代码执行结果:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Person (name, description) values (?, ?)
我期待的结果应该是数据不应该有任何变化才对,也不应该执行任何SQL语句,因为我调用了session.clear()
或者session.evict(obj)
时,person应该由持久化状态转为游离状态,期待您的回答!
PHP中文网2017-04-18 10:19:40
透過一番學習找到了問題所在,那就自問自答吧,希望能幫到其他正在學習的朋友。
原因:這個問題是由持久化類別中的XXX.hbm.xml定義的id生成器策略引發的,本人在此處使用了identity策略,使用此策略會得到session.save()
方法在得到執行時立即發出INSERT語句,此時物件無論處於任何狀態都不會影響此物件對資料庫的更新。
解決方法:id產生器策略使用非依賴資料庫產生主鍵的策略即可。
詳情請看我的剖析:Hibernate中由主鍵策略引起的session.evict()和session.clear()失效假象問題分析