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

时间:2011-09-22 10:39:16

标签: jpa annotations many-to-many

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

我有一个角色实体,其名称和ID(隐含通过AbstractPersistable):

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

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

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

我如何使用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;

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

非常感谢你的帮助!


编辑 - 删除后已解决 -


编辑2:

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

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

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

有什么区别?这有关系吗?

1 个答案:

答案 0 :(得分:14)

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

在拥有方面,您声明了关系的物理属性:

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

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

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

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

另见: