我想实现一个角色层次结构,但对于JPA Annotations来说却是新手。
我有一个角色实体,其名称和ID(隐含通过AbstractPersistable
):
@Entity
@Table(name="role")
public class Role extends AbstractPersistable<Long> {
private static final long serialVersionUID = 8127092070228048914L;
private String name;
现在我希望能够定义以下关系:
我如何使用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
属性的连接列有什么区别?这有关系吗?
答案 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;
对于多对多关系,哪一方是拥有方无关紧要(只要您一致地修改双方,因为只有拥有方的更改才会传播到数据库)。
另见: