gpt4 book ai didi

java - JPA 一对一关系创建非唯一外键

转载 作者:行者123 更新时间:2023-12-02 09:46:42 24 4
gpt4 key购买 nike

我有以下实体:

@Entity
public class A {

// id, etc..

@OneToOne
private B b;
}

a已经存在,当我向其中添加新字段b时,hibernate执行以下操作:

alter table a add column b_id int8
alter table a add constraint FKg76mxqt8whi8t8p4i7el95910 foreign key (b_id) references b

如您所见,外键列 b_id 不是唯一的。为什么会这样?一对一关系不是意味着外键必须是唯一的吗?这也是我在单向一对一关系的 JPA 规范中发现的内容:

[...] The foreign key column has the same type as the primary key of table B and there is a unique key constraint on it.

为了使其工作,我必须向该字段显式添加 @JoinColumn(unique=true) 注释。为什么我必须明确地这样做?

最佳答案

双向@OneToOne

为了创建唯一约束,您必须创建完整的双向 OneToOne 关系。

这意味着您必须在 Parent(Owning)实体上添加 @OneToOne 注释,并添加 @OneToOne(mappedBy ="...")Child 实体上。

这将为您的 id 列创建唯一约束。

否则,您将建模两种不同的关系,而不是一种双向关系;因为没有什么可以阻止当前模型让两个子对象指向同一个父对象。

官方JavaDoc for @OneToOne annotation有关附加参数的更多信息以及有关双向关系的建议。

更新:Link to hibernate specification关于它如何处理 @OneToOne 关系:

  1. 当使用双向@OneToOne关联时,Hibernate 在获取子端时强制执行唯一约束。
  2. 单向关联遵循关系数据库外键语义,客户端拥有该关系。

就你的情况

这意味着在您的 B 实体模型上,您应该为 A 实体添加一个字段,并使用 @OneToOne(mappedBy="b") 对其进行注释 使您的关系双向且完整,限制对单个父级的访问并创建唯一的约束。

关于java - JPA 一对一关系创建非唯一外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60396652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com