java - Hibernate:实体副本 [Event#XXX] 已分配给不同的实体 [Event#XXX]

标签 java spring hibernate jpa

我有两种实体:事件和时间表。我正在尝试修改它们,尽可能避免事务,以免不必要的时间锁定数据库。

所以代替:

@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/

相关文章:

java - 将 javascript 添加到 Tapestry 应用程序的方法是什么?

java - 在 Eclipse 控制台中打印唯一的 ASCII 字符

java - 通过 Intent 卸载 Android 应用程序时崩溃

java - Hibernate 单向关联问题

sql-server - Hibernate 中的 setMaxResults(N) 如何工作?

java - x =new int[2]; 是怎么做到的?在这个java代码中工作?

阅读器中发生异常时未调用 Spring Batch SkipListener

java - NoClassDefFoundException : javax/persistence/PersistenceContext Spring ORM with Hibernate

java - Spring 浏览器后退按钮处理

sql - 使用 HQL 在 from 子句中进行子查询