是否可以避免 OneToOne 关系中的代理主键并重用外键作为 id?
Posted
技术标签:
【中文标题】是否可以避免 OneToOne 关系中的代理主键并重用外键作为 id?【英文标题】:Is it possible to avoid surrogate primary key in OneToOne relation and reuse foreign key as id? 【发布时间】:2018-01-22 17:45:16 【问题描述】:一个实体ObjDetails
在OneToOne
关系中对于Obj
是可选的。
我没有看到在 ObjDetails
中使用代理主键的好处,就像官方文档和大量教程中推荐的那样:
@Entity
public class ObjDetails
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
private Obj obj;
关系是这样的,如果没有Obj
,就不可能有ObjDetails
。
Obj
可以用作ObjDetails
的主键吗?用什么语法来表达?
@Entity
public class ObjDetails
@Id
@OneToOne
private Obj obj;
我们可以避免在ObjDetails
中声明Obj
的对象类型,而是表示ObjDetails
中的Long id
与Obj
中的相同吗?
@Entity
public class ObjDetails
@Id
@OneToOne
private Long id;
【问题讨论】:
为什么人们不阅读文档? docs.jboss.org/hibernate/orm/current/userguide/html_single/… 【参考方案1】:以下是官方文档中示例的摘录副本:
@Entity
public static class Person
@Id
private Long id;
@Entity
public static class PersonDetails
@Id
private Long id;
@OneToOne
@MapsId
private Person person;
基本部分是保留原始的@Id
引用和类型化的Person
引用,由@OneToOne
标记,最重要的是由@MapsId
。
它被称为派生标识符。感谢 JB 指向文档。
【讨论】:
以上是关于是否可以避免 OneToOne 关系中的代理主键并重用外键作为 id?的主要内容,如果未能解决你的问题,请参考以下文章
JPA:将 OneToOne Long 值(不是实体)映射到另一个不是主键的表列
FetchType.LAZY 不适用于@OneToOne 关系
jpa hibernate @OneToOne @JoinColumn referencedColumnName 被忽略