JPA:合并@OneToMany重复输入错误

时间:2010-08-25 18:15:06

标签: java orm jpa

我经常收到以下错误:

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 (?, ?)")

我的课程如下:

@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.创建一个实体实例(即E1) 2.通过em.persist(E1)保持E1 3.稍后,创建另一个实体(E2)实例,通过属性关系来反映E1。 4.坚持E2:em.persist(E2)。

---到现在为止一切正常。

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

    结束编辑

    我的代码出了什么问题? 拜托,帮帮我!!!

1 个答案:

答案 0 :(得分:3)

您正在分离/合并对象的方式似乎是以某种方式破坏对象以对同一个实体进行两次引用,或者认为引用在存在时是新的。这导致INSERT进入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