Java JPA:Merge@OneToMany重复输入错误

Java JPA:Merge@OneToMany重复输入错误,java,orm,jpa,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

我总是会遇到以下错误:

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>();
}
@javax.persistence.Entity
公共类实体{
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
保护长id;
@列(nullable=false,Updateable=false)
受保护的字符串名称;
@OneToMany(cascade=CascadeType.MERGE)
受保护的集合关系=新建ArrayList();
}
此类的一个实例可以引用相同类型的其他实例(自引用)。 现在,在创建一个引用另一个实例的实例时,一切正常。 但问题是,当更新这样一个(分离的-我不太确定,因为实例是通过Facelets表单编辑的)实例时,即名称,然后通过执行EntityManager合并操作抛出异常(如上所述)

编辑:
1.创建实体的一个实例(即E1)。
2.通过em.Persist(E1)持久化E1。
3.稍后,创建实体(E2)的另一个实例,该实例通过属性关系引用E1。
4.和persistene2:em.persisten(E2)

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

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

    结束编辑

    我的代码怎么了?
    请帮帮我

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

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

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


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

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

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


    你能为整个流程显示一些(伪)代码并修复映射(或标题)吗?你能为整个流程显示一些(伪)代码并修复映射(或标题)吗?好的,现在我发现了问题。调试有点棘手,但您的猜测是对的!我不知道为什么EclipseLink在合并2个引用时得到了,但它确实得到了。删除所有内容和表结构以及逐步重新创建“实体”类解决了这个问题。谢谢!我还看到了上述行为。这些建议对我都不起作用,所以我被迫切换到休眠状态。现在一切都好了!好了,现在我找到问题了。调试有点棘手,但您的猜测是对的!我不知道为什么EclipseLink在合并2个引用时得到了,但它确实得到了。删除所有内容和表结构以及逐步重新创建“实体”类解决了这个问题。谢谢!我还看到了上述行为。这些建议对我都不起作用,所以我被迫切换到休眠状态。现在一切都好了!