是否可以避免 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 【问题描述】:

一个实体ObjDetailsOneToOne 关系中对于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 idObj 中的相同吗?

@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 被忽略

教义 - OneToOne 关系 - EntityNotFoundException

我在 Django 应用程序中同一类的两个对象之间存在 OneToOne 关系。是不是可以强制执行这种关系的唯一性?