我有兩種實體:事件和計劃。我試圖修改它們儘可能避免事務不鎖定數據庫的不必要的時間。休眠:實體副本[事件#XXX]已被分配給不同的實體[事件#XXX]
所以不是:
@Transactional
public void modify() {
Event event = em.find(...);
//... something that might take a long time
event.addSchedule(schedule);
em.flush();
}
我想寧可:
public void modify() {
Event event = em.find(...);
//... something that might take a long time
event.addSchedule(schedule);
repository.merge(event);
}
...
@Transactional
public void merge(Event event) {
em.merge(event);
em.flush();
}
的問題是這樣的,我得到異常:An entity copy [Event#XXX] was already assigned to a different entity [Event#XXX]
。我不會複製實體,也不會做任何意想不到的事情。
另外,據說有必要正確實施equals()和hashCode()方法。我有他們,但我研究的堆棧跟蹤,似乎實體相比,沒有平等的,也不是的hashCode,它們與==
比較如下圖所示:http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-core/4.1.3.Final/org/hibernate/event/internal/EventCache.java#62
他們使用IdentityHashMap,具體使用==
。
那麼我在哪裏可以找到問題?我已經嘗試從4.1.7休眠到目前的4.3.4,並且我使用hibernate.enable_lazy_load_no_trans
來加載實體而不顯式地進行會話。
謝謝。現在已經有一段時間了 – Martin