首页 > 解决方案 > 如何在 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 每当删除路线时,我也想删除与该路线相关的航班。 此外,一个航班必须只有一条路线,并且可以从多个航班中使用一条路线。

根据上述要求,我应该如何更改我的实体?

标签: javaspring-boothibernatejpaspring-data-jpa

解决方案


您的实施似乎适合您的第一个要求。但是,我会@MapsId在 OneToOne 关系中使用,因为它更有效。在以下位置获取战利品:https ://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

关于您的第二个要求和概念:另外,一个航班必须只有一条路线,并且可以从多个航班中使用一条路线,您需要将RoutFlight@ManyToOne关系更改@OneToOne


推荐阅读