gpt4 book ai didi

java - JPA:合并@OneToMany重复条目错误

转载 作者:行者123 更新时间:2023-12-02 00:50:08 24 4
gpt4 key购买 nike

我总是收到以下错误:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2-1' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO ENTITY_ENTITY (relationships_ID, Entity_ID) VALUES (?, ?)
bind => [1, 2]
Query: DataModifyQuery(sql="INSERT INTO ENTITY_ENTITY (relationships_ID, Entity_ID) VALUES (?, ?)")

我的类(class)如下:

@javax.persistence.Entity
public class Entity {


@Id
@GeneratedValue(strategy = GenerationType.TABLE)
protected Long id;

@Column(nullable=false, updatable=false)
protected String name;

@OneToMany(cascade=CascadeType.MERGE)
protected Collection<Entity> relationships = new ArrayList<Entity>();
}

此类的一个实例可以引用同一类型的其他实例(自引用)。现在,在创建一个引用另一个实例的实例时,一切正常。但问题是,当更新这样一个(分离的 - 我不太确定,因为实例是通过 Facelets 表单编辑的)实例时,即名称,然后通过执行 EntityManager 合并操作出现异常 - 如上所述 -被抛出。

编辑:
1. 创建一个Entity实例(即E1)。
2. 通过 em.persist(E1) 持久化 E1。
3. 稍后,创建另一个实体实例 (E2),该实例通过属性relationships引用 E1。
4.并持久化E2:em.persist(E2)。

--- 到目前为止一切正常。

  • 加载以浏览所有持久化实体实例并选择 E2 进行编辑(通过 Web 界面 Facelet)。
  • 更改,即 E2 的名称。
  • 要保存更改:调用 em.merge(E2)。
  • ---现在抛出异常!

    结束编辑

    我的代码有什么问题吗?请帮助我!!!

    最佳答案

    您分离/合并对象的方式似乎以某种方式破坏了对象,使其具有对同一实体的两个引用,或者认为引用存在时是新的。这导致插入重复的 OneToMany 连接表并引发约束冲突。

    在每个阶段尝试调试或检查集合的状态,是否会添加重复的实例?

    可能与缓存或更改跟踪有关。您可以尝试关闭共享缓存,或刷新对象,或禁用编织。

    http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

    http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching#How_to_refresh_the_cache

    http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#How_to_Disable_Weaving_Using_EclipseLink_Persistence_Unit_Properties

    关于java - JPA:合并@OneToMany重复条目错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568966/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com