Java 与同级联接表相关的JPA自引用实体

Java 与同级联接表相关的JPA自引用实体,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我有一个具有子对象和父对象的自引用实体。我有一个连接表来存储互斥的兄弟姐妹。当在数据库中创建实体时,我得到这个异常 原因:org.springframework.orm.jpa.JpaSystemException:org.hibernate.persistentObject异常:传递给persist的分离实体 主桌将有 ID Text Parent 1 ABC null 2 CBD 1 3 XYZ 1 联接表应具有 entity sibling 2 3

我有一个具有子对象和父对象的自引用实体。我有一个连接表来存储互斥的兄弟姐妹。当在数据库中创建实体时,我得到这个异常

原因:org.springframework.orm.jpa.JpaSystemException:org.hibernate.persistentObject异常:传递给persist的分离实体

主桌将有

ID Text Parent
1  ABC   null
2  CBD    1
3  XYZ    1
联接表应具有

entity sibling
2        3
实体映射是否正确

@Entity
public class TestEntity {
   @id
   @GeneratedValue
   private int id;
   private String Text;
   @ManyToOne
   private TestEntity parent;

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="mutuallyExclusiveSiblings",
        joinColumns={@JoinColumn(name="entity", referencedColumnName="id")},
        inverseJoinColumns={@JoinColumn(name="sibling", referencedColumnName="id")})
        private Set<TestEntity> exclusiveSiblings;


}
任何帮助实现这一点都将不胜感激。谢谢。

CascadeType。所有这一切都意味着对具有某些TestEntity同级的TestEntity调用persist将触发插入测试实体和同级测试实体

如果其中任何一个已作为Id填充,则将导致错误,as PERSISTER仅适用于数据库中尚不存在的新创建实体

因此,如果要将新的TestEntity链接到数据库中现有的兄弟节点,那么最好只调用新TestEntity上的persist,而不首先添加子节点


此时,新的TestEntity将被脏检查,您可以将其链接到现有的兄弟姐妹,会话刷新时将触发关联表中的插入。

您可能希望发布用于持久化实体的代码段。您正在对分离的实体(即已具有ID的实体)调用持久化。这就是问题所在。抱歉,我无法发布实际的代码,因为我所在的位置存在专有机密信息问题。。。下面是上面示例的代码。谢谢你的帮助。TestEntity te=新的TestEntity;te.setId4;te.setParentnull;Set exsib=新哈希集;te.SetExclusiblingSexsib;List ret=新阵列列表;ret=testEntityService.getByTextXXX;forTestEntity t:ret{te.getExclusiveSiblings.addt;}testEntityService.createRecordte;在注释中查找格式化代码的方法。在我的一个测试中,您是对的,这两个表都被插入了。用例是我想插入一个id为4的新TestEntity,但它将具有现有的互斥同级,例如id为2。在创建新TestEntity时,应在TestEntity表中创建TestEntity 4,并在join表中创建IDS4和IDS2。谢谢