【问题标题】:MapsId not used, is it automatically understood?MapsId没用过,是自动理解的吗?
【发布时间】:2021-07-24 10:14:44
【问题描述】:

在页面on Baeldung 的这一部分中,在class CourseRegistration 中,他没有使用@MapsId("id"),甚至在JoinColumn 注释中也没有使用"referencedColumnName"。本页之前的示例并非如此。我觉得应该使用MapsIdJoinColumnreferencedColumnName。如果不是为什么?他在同一页面的所有其他示例中都使用了上述内容。

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

    我觉得 MapsId 和 JoinColumn with referencedColumnName 应该已经使用了。如果不是为什么?他在同一页面的所有其他示例中都使用了上述内容。

    在您提供的示例中,他在关系的另一端使用mappedBy 属性,其中存在OneToMany。这个 mappedBy 属性为 JPA 提供了必要的信息,以了解这两个实体之间的关系。请记住,实体字段代表数据库中的列,JPA 知道这些列是什么。

    使用mappedBy 的实体表示另一方的另一个实体是这两个实体之间关系的所有者。

    @ManyToOne 没有mappedBy 属性,因为默认情况下,当您同时拥有@OneToMany@ManyToOne 时,拥有@ManyToOne 的一方是关系的所有者。所以@ManyToOne 上不存在mappedBy 来短路这个默认机制。

    但是有一种方法可以使具有@ManyToOne 的实体成为关系的所有者。您还必须在@ManyToOne 上面加上@JoinColumn(name = "ref", referencedColumnName = "ref2")

    总结您指向的示例使用默认机制,其中带有@ManyToOne 的一侧是关系的所有者,并且直接从另一侧用@OneToMany 上的 mappedBy 属性。

    奖金

    @JoinColumn(name = "student_id") 不带 referencedColumnName 不用于指示关系的所有者方,而是通知 JPA 将用作外键的额外列与实体有。所以它只是用来覆盖JPA将用作外键的外键列名,与java字段名不同。

    至于@MapsId,请查看answer 以更好地了解它的使用方式

    【讨论】:

      【解决方案2】:

      出于不同的原因,此处不需要两者:

      • @MapsId 主要用于在实体之间共享主键。 CourseRegistration 是它自己的实体,有自己的主键,因此这里不需要它。以下是官方文档的引用:

      指定 ManyToOne 或 OneToOne 关系属性 提供 EmbeddedId 主键、属性的映射 在 EmbeddedId 主键或 母实体。 value 元素指定 a 中的属性 关系属性对应的复合键。如果 实体的主键与主键的 Java 类型相同 关系引用的实体,值属性不是 指定。

      (https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/MapsId.html)

      • referencedColumnName 默认使用被引用表的主键名称,因此不需要明确:

      默认(仅在使用单个连接列时适用):相同 name 作为被引用表的主键列。

      (https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html#referencedColumnName())

      【讨论】:

        猜你喜欢
        • 2014-10-03
        • 2012-04-12
        • 2015-11-17
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 2012-01-27
        相关资源
        最近更新 更多