当前位置: 首页 > 面试题库 >

没有连接表的多对多关联

秦宏盛
2023-03-14
问题内容

我想在以下(简化的)数据库中应用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
}

但是注释“ @ManyToMany”似乎仅可用于“ @JoinTable”,在这种情况下,它不可用(据我所知)。有人知道修改数据库之外是否还有其他方法吗?


问题答案:

JPA不允许这样做,因为它需要外键来引用完整的主键以用于标识目的,并且它可能不适用于缓存。如果可以,我建议使用使用实际主键的关系表切换到更传统的模型。

如果您的提供程序允许映射部分pk(我相信Hibernate可以这样做),您要做的就是使用JoinColumn而不是JoinTable进行两个1:M映射,但是将Node->
Authority上的一个标记为insertable = false,updatable = 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;
    ...


 类似资料:
  • 在我的应用程序中,用户和首选项实体之间存在多对多关联。由于连接表需要一个额外的列,因此我必须将其分解为2个一对多的关联: 用户实体: 偏好实体: 用户首选项实体: 为了更新其中一个首选项,我循环浏览用户的一组首选项,并更新值如下: 我已经确认,我试图更新的用户变量在代码运行后确实包含新值。更奇怪的是,当重定向发生时,该值会在网页上更新,但数据库不会更新!这是我用来做更新的代码,这个类用@Trans

  • 我有2个具有多对多关系的实体User和AcCountBase。我需要从连接表中选择所有具有选定用户ID的AcCountBase对象。我尝试了一些连接查询,但不起作用。

  • 我用Hibernate的JPQL查询获取了一个公司实体。该实体与关键字实体有多对多关联。由于联接表有一个额外的列处于活动状态,因此该表已映射到一个公司关键字实体。所以协会是这样的: 公司 现在,来自实体的关联是惰性的,并且它不会被我的JPQL查询初始化,因为我想避免产生笛卡尔产品性能问题。这就是为什么我想在运行JPQL查询后初始化关联,例如: 对于“正常的”多对多关联,这将非常有效,因为所有关联实

  • 问题内容: 问题 首先,我想知道我的数据库结构很糟糕,但是目前我无法更改它。 话虽这么说,我需要在Hibernate(4.2.1)中创建一对多的双向关系,该关系不涉及主键(关系的“父”侧仅包含唯一键)并且不涉及联接表。表示这种关系的外键是从“子”到“父”的反向指针(请参见下文)。我已经搜索并尝试了各种不同的注释配置,但是没有运气。我要的是可能的吗? 数据库 GLOBAL_PART PART_REL

  • 我有一个关于Hibernate ManyToMany映射的问题。我有两个类 A 和 B,它们之间的映射是由 Hibernate 解析的 ManyToMany 映射: 用户和组的外键是“A_id”和“B_id”。联接表称为A_B。 现在,我想加上C。我想A_B与C有关系,与C创建多对多关系,A_B我可以称之为A_B_C。 编辑:所以我会创建一个_B实体,A和B和A_B的关系为2 @OneToMany

  • 给定两个具有一对多关系的表(SQLServer的脚本): 一个人只有一个地址,但同一地址可以链接到多个不同的人。 还有一个Spring JPA存储库,其中包含一个显式查询: 使用Hibernate作为JPA提供程序,会为该查找方法生成类似的SQL: 因为我对表中的任何数据都不感兴趣,而且我已经知道了,所以似乎没有真正需要连接: 这个查询给出了相同的结果。 我是否可以让JPA/Hibernate在没