JPA @OneToOne共享 ID -- 我能做得更好吗?
我正在使用一个我宁愿不更改的现有架构。该架构在表 Person 和 VitalStats 之间具有一对一关系,其中 Person 具有主键,而 VitalStats 使用与其主键和 Person 的外键相同的字段,这意味着其值是 Person 的相应 PK 的值。
这些记录是由外部进程创建的,我的JPA代码永远不需要更新VitalStats。对于我的对象模型,我希望我的 Person 类包含一个 VitalStats 成员,但是:
当我尝试时
@Entity
public class Person{
private long id;
@Id
public long getId(){ return id; }
private VitalStats vs;
@OneToOne(mappedBy = “person”)
public VitalStats getVs() { return vs; }
}
@Entity
public class VitalStats{
private Person person;
@OneToOne
public Person getPerson() { return person; }
}
我有一个问题,VitalStats缺少@Id,这不适用于@Entity。
如果我尝试
@Id @OneToOne
public Person getPerson() { return person; }
这解决了@Id问题,但要求Person是可序列化的。我们再回到这个问题上来。
我可以制作VitalStats@Embeddable并通过@ElementCollection将其连接到Person,但随后必须将其作为集合进行访问,即使我知道只有一个元素。可行,但两者都有点烦人,有点令人困惑。
那么,是什么阻止了我说 Person 实现了 Serializable 呢?真的,除了我喜欢代码中的所有内容都是有原因的,而且我看不到任何逻辑,这使得我的代码可读性降低。
与此同时,我只是用一个长 personId 替换了 VitalStats 中的 Person 字段,并使 VitalStats @Id,所以现在@OneToOne工作正常。
所有这些解决方案(在我看来)似乎是一个直截了当的问题,都有点笨拙,所以我想知道我是否错过了什么,或者是否有人可以至少向我解释为什么Person必须是可序列化的。
断续器