Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一实体对象之间多对多关系的JPA注释_Jpa_Annotations_Many To Many - Fatal编程技术网

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

同一实体对象之间多对多关系的JPA注释,jpa,annotations,many-to-many,Jpa,Annotations,Many To Many,我想实现一个角色层次结构,但对JPA注释来说是相当陌生的 我有一个具有名称和id的角色实体(通过AbstractPersistable隐式): @实体 @表(name=“role”) 公共类角色扩展了可抽象持久化{ 私有静态最终长serialVersionUID=8127092070228048914L; 私有字符串名称; 现在,我希望能够定义以下关系: 一个角色可以有多个子角色 一个角色可以是多个角色的子角色 如何使用Hibernate注释来实现这一点?我可以在角色实体中定义它吗 @Ma

我想实现一个角色层次结构,但对JPA注释来说是相当陌生的

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

@实体
@表(name=“role”)
公共类角色扩展了可抽象持久化{
私有静态最终长serialVersionUID=8127092070228048914L;
私有字符串名称;
现在,我希望能够定义以下关系:

  • 一个角色可以有多个子角色
  • 一个角色可以是多个角色的子角色
如何使用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;
@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;
对于多对多关系,哪一方是拥有方并不重要(只要您一致地修改双方,因为只有拥有方的更改才会传播到数据库)

另请参见:


看起来你的工作方式和我的一样好(见edit2)。想知道有什么区别吗?@Pete:Without
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;