java - 如何在 JPA 中的 onetoone 和 manytoone 单向关系中使用 cascade.delete / orphanremoval?
问题描述
假设我在下面有实体;
class Airport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id", unique = true, updatable = false)
private Long id;
... //unrelated fields
}
class Route {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id", unique = true, updatable = false)
private Long id;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "DeparturePlaceId", referencedColumnName = "Id")
private Airport departurePlace;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "DestinationPlaceId", referencedColumnName = "Id")
private Airport destinationPlace;
... //unrelated fields
}
class Flight {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id", unique = true, updatable = false)
private Long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "RouteId")
private Route route;
}
要求 1:我想在 Airport 和 Route 之间建立关系,这样 Airport 不需要知道 Route 和 Route 需要有离开机场和目的地机场,当机场被删除时,我也想删除有该机场的路线出发或目的地机场。
要求 2:如何在 Route 和 Flight 之间建立关系,这样 Route 不需要知道 Flight 并且 Flight 也需要有 Route 每当删除路线时,我也想删除与该路线相关的航班。 此外,一个航班必须只有一条路线,并且可以从多个航班中使用一条路线。
根据上述要求,我应该如何更改我的实体?
解决方案
您的实施似乎适合您的第一个要求。但是,我会@MapsId
在 OneToOne 关系中使用,因为它更有效。在以下位置获取战利品:https ://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/
关于您的第二个要求和概念:另外,一个航班必须只有一条路线,并且可以从多个航班中使用一条路线,您需要将Rout和Flight的@ManyToOne关系更改为@OneToOne。
推荐阅读
- vba - VBA 电子邮件生成器 - 向员工发送逾期工单通知
- javascript - React 不会使用 setState 立即重新渲染
- c# - .Net Core Identity AuthenticationCookie 不起作用
- javascript - 使用 supertest 实现测试 API 时添加期望方法时出错
- ruby - 无法超时以在 Ruby 中使用 net http 正常工作
- css - 您如何有条件地将多个类应用于单个 Material UI 类道具
- python - discord py - 如果用户回复我的机器人,则发送不同的消息
- javascript - Understanding LinkedLists References
- hashicorp-vault - Hashicorp Vault Policy is not getting assigned
- python - 什么时候可以在定义之前使用名称?