gpt4 book ai didi

jpa - 通过双向@ManyToMany : what is the reason映射

转载 作者:行者123 更新时间:2023-12-03 15:58:53 24 4
gpt4 key购买 nike

  • 在双向多对多关系中设置MappedBy的原因是什么?
  • 当一个表中有大量记录时,另一个表中有少量记录时,哪一侧最好放置mapledBy?
  • 最佳答案

    这实际上是一个很好的问题,它有助于理解“拥有”实体的概念。如果要防止双方(双向关系)都使用join tables(一个好主意),则需要在一侧上有一个mappedBy=元素。

    是否存在join tablemappedBy="name"批注的@ManyToMany元素控制。 Javadoc for mappedBy for the ManyToMany annotation says:

    The field that owns the relationship. Required unless the relationship is unidirectional.



    对于您的(双向)示例,如果仅存在两个 @ManyToMany批注,而没有 mappedBy=元素,则默认值将具有两个 Entity表和两个 Join Tables:
    Hibernate: create table SideA (id bigint not null, primary key (id))
    Hibernate: create table SideA_SideB (sidea_id bigint not null, sidebs_id bigint not null, primary key (sidea_id, sidebs_id))
    Hibernate: create table SideB (id bigint not null, primary key (id))
    Hibernate: create table SideB_SideA (sideb_id bigint not null, sideas_id bigint not null, primary key (sideb_id, sideas_id))

    这就是说每个实体都“拥有”其 ManyToMany关系,但在典型的用例中,多余的 join table是多余的,Javadoc说您需要 mappedBy批注。如果我决定让SideA“拥有”该关系,则将 mappedBy=元素添加到SideB实体中,以指定它不拥有该关系:
    @Entity
    public class SideA {
    @ManyToMany
    Set<SideB> sidebs;
    }
    @Entity
    public class SideB {
    @ManyToMany(mappedBy="sidebs")
    Set<SideA> sideas;
    }

    由于SideB实体不再拥有其 ManyToMany关系,因此将不会创建额外的 JoinTable:
    Hibernate: create table SideA (id bigint not null, primary key (id))
    Hibernate: create table SideB (id bigint not null, primary key (id))
    Hibernate: create table SideA_SideB (sideas_id bigint not null, sidebs_id bigint not null, primary key (sideas_id, sidebs_id))

    这对开发人员很重要,因为他(她)必须理解,除非将关系添加到拥有的实体(在本例中为 SideA实体)中,否则任何关系都不会持久。

    因此,如果您具有 bidirectional ManyToMany关系,这意味着您在所涉及的两个实体上都具有 ManyToMany,则应按照Javadoc在其中一个实体上添加 mappedBy="name",以免产生多余的 join table

    至于建立拥有实体的哪一方,没有正确的答案,这取决于您的系统认为最好的。仅当条目放在所有者一方时,该关系才会持久,因此您必须问自己,是更常见的是更改 SideA's列表还是 SideB's列表。如果 SideA拥有该关系,则可以通过在 SideB实例中添加或删除 SideA实例来更新该关系,但是如果您有要保留的 SideASideB实例列表,则需要遍历该列表并更改每个实例列表中的 SideA

    与往常一样,启用sql日志并查看数据库中正在发生的情况总是一个好主意:

    编辑:如果您有一个持久性提供程序,它仅创建一个没有 mappedBy设置的联接表,那么您必须检查文档以查看哪一方“拥有”该关系。可能是一方或双方都不拥有它,而更新双方或一方都不会保留该实体。

    引用:

    What is the difference between Unidirectional and Bidirectional associations?

    What does relationship owner means in bidirectional relationship?

    What is the “owning side” in an ORM mapping?

    Most efficient way to prevent an infinite recursion in toString()?

    关于jpa - 通过双向@ManyToMany : what is the reason映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37243159/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com