与兄弟连接表有关的JPA自引用实体

时间:2014-02-20 21:21:44

标签: java sql hibernate jpa

我有一个带有孩子和父母的自引用实体。我有一个连接表来存储互斥的兄弟姐妹。在数据库中创建实体时,我得到了这个例外......

引起:org.springframework.orm.jpa.JpaSystemException:org.hibernate.PersistentObjectException:传递给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;


}

任何帮助实现这一点的人都表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

CascadeType.ALL表示在带有TestEntity个兄弟姐妹的TestEntity上调用持久化将触发测试实体和兄弟测试实体的插入。

如果已填充的任何一个已填充,将导致错误,因为持久性仅适用于数据库中尚不存在的新创建的实体。

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

此时新的TestEntity将变为脏检查,您可以将其链接到现有的兄弟节点,这会在会话刷新时触发关联表中的插入。