同一实体对象之间多对多关系的JPA注释
我想实现一个角色层次结构,但对JPA注释来说是相当陌生的 我有一个具有名称和id的角色实体(通过同一实体对象之间多对多关系的JPA注释,jpa,annotations,many-to-many,Jpa,Annotations,Many To Many,我想实现一个角色层次结构,但对JPA注释来说是相当陌生的 我有一个具有名称和id的角色实体(通过AbstractPersistable隐式): @实体 @表(name=“role”) 公共类角色扩展了可抽象持久化{ 私有静态最终长serialVersionUID=8127092070228048914L; 私有字符串名称; 现在,我希望能够定义以下关系: 一个角色可以有多个子角色 一个角色可以是多个角色的子角色 如何使用Hibernate注释来实现这一点?我可以在角色实体中定义它吗 @Ma
AbstractPersistable
隐式):
@实体
@表(name=“role”)
公共类角色扩展了可抽象持久化{
私有静态最终长serialVersionUID=8127092070228048914L;
私有字符串名称;
现在,我希望能够定义以下关系:
- 一个角色可以有多个子角色
- 一个角色可以是多个角色的子角色
@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;
@ManyToMany(cascade=CascadeType.MERGE)
@JoinTable(name=“role\u hierarchy”,
joinColumns={@JoinColumn(name=“role_id”)},
inverseJoinColumns={@JoinColumn(name=“child\u role\u id”)}
私有列表角色;
@多个(级联=级联类型.MERGE)
@JoinTable(name=“role\u hierarchy”,
joinColumns={@JoinColumn(name=“child\u role\u id”)},
inverseJoinColumns={@JoinColumn(name=“role\u id”)})
私人名单儿童;
我走对了吗?我错过了什么
非常感谢你的帮助
编辑:-解决后删除-
编辑2: 看起来我的应用程序堆栈中有一些bug。在模型定义级别上,角色层次结构运行得很好,所以不要介意编辑1 但是:这两种方法似乎都有效(即创建m:n表条目、级联删除和检索实体的父项和子项):
- 我的建议是在
注释处为两侧定义一个连接列,不使用@ManyToMany
属性mappedBy
- 以及定义拥有方和反向方
有什么区别?有关系吗?双向关系包括拥有和反向两个方面 在拥有方声明关系的物理属性:
@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)
@JoinTable(name = "role_hierarchy",
joinColumns = { @JoinColumn(name = "role_id")},
inverseJoinColumns={@JoinColumn(name="child_role_id")})
private List<Role> roles;
@ManyToMany(cascade = CascadeType.MERGE, mappedBy = "roles")
private List<Role> children;