JPA对同一实体的对象之间的多对多关系的注释

Pet*_*ete 4 annotations many-to-many jpa

我想实现一个角色层次结构,但对于JPA Annotations来说却是新手.

我有一个带有名称和id的角色实体(隐式通道AbstractPersistable):

@Entity
@Table(name="role")
public class Role extends AbstractPersistable<Long> {
    private static final long serialVersionUID = 8127092070228048914L;  
    private String name;
Run Code Online (Sandbox Code Playgroud)

现在我希望能够定义以下关系:

  • 角色可以有许多子角色
  • 角色可以是多个角色的子角色

我如何使用Hibernate注释做到这一点?我可以在角色实体中定义它

@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable( name = "role_hierarchy", 
            joinColumns = { @JoinColumn(name = "role_id")}, 
            inverseJoinColumns={@JoinColumn(name="child_role_id")})  
private List<Role> roles;

@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable( name = "role_hierarchy", 
            joinColumns = { @JoinColumn(name = "child_role_id")}, 
            inverseJoinColumns={@JoinColumn(name="role_id")})  
private List<Role> children;
Run Code Online (Sandbox Code Playgroud)

我是在正确的轨道上吗?我错过了什么?

非常感谢你的帮助!


编辑: - 删除,因为它已被解决 -


编辑2:

看起来我的应用程序堆栈中有一些错误.在模型定义级别上,role_hierarchy工作正常,所以不要介意编辑1 ...

但是:两种方式似乎都有效(即创建m:n表条目,级联删除和检索实体的父级和子级):

  • 我建议为注释中没有mappedBy属性的双方定义连接列@ManyToMany
  • 以及定义拥有方和反方.

有什么不同?有关系吗?

axt*_*avt 14

双向关系包括拥有和反向.

在您自己的方面,您声明关系的物理属性:

@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(name = "role_hierarchy", 
            joinColumns = { @JoinColumn(name = "role_id")}, 
            inverseJoinColumns={@JoinColumn(name="child_role_id")})  
private List<Role> roles;
Run Code Online (Sandbox Code Playgroud)

在反面,您指向具有mappedBy属性的相应拥有方:

@ManyToMany(cascade = CascadeType.MERGE, mappedBy = "roles")
private List<Role> children;    
Run Code Online (Sandbox Code Playgroud)

对于多对多关系而言,哪一方是拥有方无关紧要(只要您一致地修改双方,因为只有拥有方的更改才会传播到数据库).

也可以看看: