Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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
Java 无联接表的多对多关联_Java_Sql_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Java 无联接表的多对多关联

Java 无联接表的多对多关联,java,sql,hibernate,jpa,jpa-2.0,Java,Sql,Hibernate,Jpa,Jpa 2.0,我想在以下(简化)数据库中应用JPA: NODE AUTHORITY ----- ---------- idNode int idAuthorities int nameNode varchar(50) person varchar(255) idAuthorities int rank int PRIMARY KEY (idNo

我想在以下(简化)数据库中应用JPA:

NODE                         AUTHORITY
-----                        ----------
idNode int                   idAuthorities int
nameNode varchar(50)         person varchar(255)
idAuthorities int            rank int
PRIMARY KEY (idNode)         PRIMARY KEY (idAuthorities, rank)
FOREIGN KEY (idAuthorites)
因此,一个节点可以有多个权限,一个权限可以被多个节点引用

我希望我的课程看起来像:

@Entity
@Table(name="NODE")
public class Node {

    private Integer id;
    private String nameNode;
    private Set<Authority> authorities;

    // ... getter and setter normaly annoted for "id" and "nameNode"

    @ManyToMany
    public Set<Authority> getAuthorities(){
        return authorities;
    }
    // ... setter ...

}

@Entity
@Table(name="AUTHORITY")
public class Authority {

    private AuthorityPK pk;
    private String person;
    privat Set<Node> nodes;

    // ... getter and setter normaly annoted for "person"

    @Id
    public AuthorityPK getPk(){
        return this.pk
    }
    // ... setter ...

    @ManyToMany
    public Set<Node> getNodes(){
        return nodes;
    }
    // ... setter ...

}

@Embeddable
public class AuthorityPK implements Serializable {
    private Integer idAuthorities;
    private Integer rankAuthorities;

    // override of equals and hashCode
}
@实体
@表(name=“NODE”)
公共类节点{
私有整数id;
私有字符串名称节点;
私人机构;
//…为“id”和“nameNode”添加了正常的getter和setter
@许多
公共设置权限(){
返回当局;
}
//…塞特。。。
}
@实体
@表(name=“AUTHORITY”)
公共阶级权威{
私人作家;
私人串人;
privat集节点;
//…getter和setter通常为“person”注释
@身份证
公共AuthorityPK getPk(){
退回这个.pk
}
//…塞特。。。
@许多
公共集getNodes(){
返回节点;
}
//…塞特。。。
}
@可嵌入
公共类AuthorityPK实现可序列化{
私有整数权限;
私有整数rankAuthorities;
//重写equals和hashCode
}
但是注释“@ManyToMany”似乎只能与“@JoinTable”一起使用,而“@JoinTable”在这种情况下是不可用的(据我所知)。
有人知道除了修改数据库之外还有什么方法吗

JPA不允许这样做,因为它需要外键来引用完整的主键以进行身份验证,而且它可能无法与缓存一起工作。如果可以,我建议您使用使用使用实际主键的关系表切换到更传统的模型

如果您的提供者允许映射部分PK(我相信Hibernate允许),那么您需要做的是使用JoinColumn而不是JoinTable创建两个1:M映射,但是将Node->Authority上的映射标记为insertable=false,Updateable=false

例如,类似于:

public class Node {
    @Id
    private Integer id;
    private String nameNode;
    @OneToMany
    @JoinColumn(name = "idAuthorites", referencedColumnName = "idAuthorites", insertable=false, updatable=false)
    private Set<Authority> authorities;
    ...

public class Authority {
    @Id
    private AuthorityPK pk;
    private String person;
    @OneToMany
    @JoinColumn(name = "idAuthorites", referencedColumnName = "idAuthorites")
    private Set<Node> nodes;
    ...
公共类节点{
@身份证
私有整数id;
私有字符串名称节点;
@独身癖
@JoinColumn(name=“idAuthorites”,referencedColumnName=“idAuthorites”,insertable=false,updateable=false)
私人机构;
...
公共阶级权威{
@身份证
私人作家;
私人串人;
@独身癖
@JoinColumn(name=“idAuthorites”,referencedColumnName=“idAuthorites”)
私有集节点;
...

您描述的不是多对多关系,而是“节点”和“权限”之间的多对一关系。许多“节点”可以具有相同的(一)“权威”。从来没有任何“节点”多于一个“权威”。我感觉,你的类名“节点”和“权威”被错误地选择了。这些类的每个实例似乎都代表了人们通常称之为一个“节点”或“权威”的东西。没错,这些类的名称被错误地选择了。但是class“节点”可以引用多个“权限”,因为任意数量的节点都可以具有相同的字段“idAuthority”(主键是“rankAuthority”和“idAuthority”的组合)JPA不允许这样做,因为它需要外键来引用完整的主键以进行身份验证。您需要查看JPA之外的特定于提供商的代码才能使其正常工作。