首页 > Java > java教程 > 正文

JPA 和 Hibernate 中的'MappedBy”如何帮助管理双向关系并提高数据库模式的简单性?

Patricia Arquette
发布: 2024-11-03 13:01:30
原创
875 人浏览过

How does `MappedBy` in JPA and Hibernate help manage bidirectional relationships and improve database schema simplicity?

了解 JPA 和 Hibernate 中的 MappedBy

MappedBy 在管理 Java Persistence API (JPA) 和 Hibernate 中对象关系映射的双向关系方面发挥着至关重要的作用。这是在数据库上下文中建模和导航复杂关系的一种实用方法。

MappedBy 的推荐用法

在您的具体示例中,航空公司拥有许多 AirlineFlight,并且许多 AirlineFlight 属于一家航空公司、mappedBy用于避免重复信息存储。由于您希望AirlineFlights成为拥有的类,因此您在Airline类中指定mappedBy属性:

<code class="java">@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinColumn(name="IDAIRLINE")
public Set<AirlineFlight> getAirlineFlights() {
    return airlineFlights;
}</code>
登录后复制

@OneToMany注释中的mappedBy参数指定AirlineFlights表中的IDAIRLINE列是外键映射回航空公司表中的主键。这样,当您查询 Airline 对象时,您还可以轻松获取其关联的 AirlineFlights。

MappedBy 的用途

MappedBy 有几个重要用途:

  • 防止 SQL 联接复制信息:如果没有mappedBy,Airline 和 AirlineFlights 之间的联接将同时包含 IDAIRLINE 主键和 AirlineFlights 表中的外键。这可能会导致数据重复和性能问题。
  • 提高数据库架构简单性:通过使用mappedBy,您可以确保只有一个表包含外键,从而形成更简单、更规范的数据库schema.
  • 支持双向导航:它允许您在两个方向上遍历关系(从 Airline 到 AirlineFlights,反之亦然),而无需编写显式连接查询。

您的特定场景

在您的示例中,AirplaneFlights 表将 IDAIRLINE 列作为指向 Airline 表的外键,但 Airline 表没有相应的 IDAIRLINEFLIGHTS 列。此设置表明 AirlineFlights 是拥有实体,即使您的要求是让 Airline 作为所有者。

要解决此问题,您需要相应地调整注释。 AirlinesFlights 上的 @OneToMany 注释应移至 AirlineFlight 类,并且mappedBy 属性应引用 Airline 类中的“拥有”字段:

<code class="java">@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="IDAIRLINE", nullable=false)
@MapsId
public Airline getAirline() {
    return airline;
}</code>
登录后复制

通过指定mappedBy 和@MapsId,您表明Airline 的主键(不是 AirlineFlights 中的 IDAIRLINE 外键)用于定义关系。这将确保航空公司是拥有实体,并且可以根据需要急切或延迟地获取。

以上是JPA 和 Hibernate 中的'MappedBy”如何帮助管理双向关系并提高数据库模式的简单性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板