双向一对一映射到多个字段

Lau*_*ens 4 java jpa jakarta-ee

我有一个名为的域类Flight,它代表已飞行的航班。我有另一个名为的类Movement,它可以代表出发或到达,并包含日期和时间以及发生运动的机场。

@Entity
public class Flight implements Serializable {

    private Movement departure;
    private Movement arrival;
}

@Entity
public class Movement implements Serializable {
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateTime;
    @ManyToOne
    private Airport airport;

    private Flight flight;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何正确注释班级中的flight字段Movement。我认为Flight类必须是关系的拥有方,因为如果不是,则无法判断Movement特定的Flightdeparture还是arrival

@OneToOne
private Movement departure;
@OneToOne
private Movement arrival;
Run Code Online (Sandbox Code Playgroud)

然而,这带来了一个问题。我不能在地图flight领域Movement的两个字段类:

// This obviously does not work
@OneToOne(mappedBy = "departure")
@OneToOne(mappedBy = "arrival")
private Flight flight;
Run Code Online (Sandbox Code Playgroud)

我将如何正确注释这个,让 thedeparturearrivalfield 正确引用 theMovement并且仍然能够让类flight上的字段Movement引用Flight类?

JB *_*zet 5

如果你真的需要一个双向关系,那么你需要有运动的字段,其中一个总是为空:

@OneToOne(mappedBy = "departure")
private Flight departureFlight;

@OneToOne(mappedBy = "arrival")
private Flight arrivalFlight;
Run Code Online (Sandbox Code Playgroud)

但是你可以有一个 getter:

public Flight getFlight() {
    return departureFlight == null ? arrivalFlight : departureFlight;
}
Run Code Online (Sandbox Code Playgroud)