【发布时间】:2020-06-09 07:22:13
【问题描述】:
我有以下实体:
@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 规范中发现的单向一对一关系:
[...] 外键列与主键类型相同 表 B 上存在唯一键约束。
为了使它工作,我必须明确地将@JoinColumn(unique=true) 注释添加到该字段。为什么我必须明确地这样做?
【问题讨论】:
-
我认为默认情况下它没有将外键设置为唯一是因为您可以在表中使用该外键拥有多行,通常很明显,并且文档没有说该外键约束默认是唯一的:javaee.github.io/javaee-spec/javadocs/javax/persistence/…
-
但是我不应该能够在一对一关系中的多行中拥有相同的外键。一对一意味着外键只是一行的一部分。如果它包含在多行中,则它不是一对一的关系。
-
你使用的是哪个休眠版本?
-
不知道B模型有没有
mappedBy属性。但为了拥有唯一约束,您需要让关系的非所有者方拥有mappedBy属性集。没有它,您将建模两种不同的关系而不是一种双向关系;因此,没有什么能阻止当前模型让两个 Childs 指向同一个 Parent。请同时包含模型 B 关系的代码 -
我有一个单向映射。所以
B没有字段A。