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

Java 双向一对一映射到多个字段,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我有一个名为Flight的域类,它表示已飞行的航班。我有另一个类叫做Movement,它可以表示出发或到达,包含日期和时间以及发生移动的机场 @Entity public class Flight implements Serializable { private Movement departure; private Movement arrival; } @Entity public class Movement implements Serializable {

我有一个名为
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;
}
但是,我不知道如何正确注释
移动
类中的
航班
字段。我认为
航班
类必须是关系的拥有方,因为如果不是,则无法判断特定
航班的
移动
出发
还是
到达

@OneToOne
private Movement departure;
@OneToOne
private Movement arrival;
然而,这带来了一个问题。我无法在两个字段上映射
移动
类中的
航班
字段:

// This obviously does not work
@OneToOne(mappedBy = "departure")
@OneToOne(mappedBy = "arrival")
private Flight flight;

我怎样才能正确地注释这一点,让
出发
到达
字段正确地引用
移动
,并且仍然能够让
移动
类上的
航班
字段引用
航班

如果需要双向关系,您可以将关系类型更改为
@ManyToMany
,这样就可以使用带有附加状态列的联接表。在那里你可以指定是到达还是离开

提供一个如何映射它的示例。然而,这种关系在代码中处理起来相当麻烦


或者你根本不需要双向关系,就像glowcoder建议的那样?映射、使用和运行都会简单得多。

如果您确实需要双向关系,则需要移动字段,其中一个字段始终为空:

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

@OneToOne(mappedBy = "arrival")
private Flight arrivalFlight;
但是你可以有一个单一的getter:

public Flight getFlight() {
    return departureFlight == null ? arrivalFlight : departureFlight;
}

为什么运动需要知道它们在哪一段?我们不应该忘记,JPA工具仍然应该使用“常规”getter。@MaDa:不。JPA可以直接从字段中获取/设置值,而不需要getter/setter。你确定有JPA工具可以做到吗?我怀疑这是否是规范的一部分。。。劳伦斯没有说他用了什么。是的,我肯定。请参阅规范的第2.1.1段:“持久性提供程序运行时通过JavaBeans样式的属性访问器或实例变量访问实体的持久性状态”。JPA2甚至引入了@Access注释,允许指定要使用的访问类型,并在单个实体中混合访问类型谢谢大家的回复!考虑到每个人的意见,我决定将这种关系改为单向关系,完全避免这个问题。仔细考虑后,我意识到我并不是绝对需要这种关系。