我有两种实体:事件和时间表。我正在尝试修改它们,尽可能避免事务,以免不必要的时间锁定数据库。
所以代替:
@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();
}
问题是,像这样我遇到了异常:实体副本 [Event#XXX] 已分配给不同的实体 [Event#XXX]
。我不会复制该实体,也不会对其进行任何意外的操作。
此外,据说有必要正确实现 equals() 和 hashCode() 方法。我有它们,但是当我研究了堆栈跟踪时,似乎这些实体不是通过 equals 进行比较,也不是通过 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,并且使用 hibernate.enable_lazy_load_no_trans
来加载实体,而无需显式拥有 session 。
最佳答案
我已经通过将已发布类的所有关系上的 Cascade 类型从 All 更改为 Persist 来解决这个问题。
关于java - Hibernate:实体副本 [Event#XXX] 已分配给不同的实体 [Event#XXX],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392410/