我有以下实体:
@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)
在字段中明确添加注释。为什么我必须明确地这样做?
为了创建唯一约束,您必须创建一个完整的双向OneToOne
关系。
这意味着您必须@OneToOne
在父级(拥有)实体上添加注释,并@OneToOne(mappedBy="...")
在子级实体上添加注释。
这将在您的id列上创建唯一约束。
否则,您将建模两个不同的关系,而不是一个双向关系。因此,没有什么可以阻止当前模型具有两个指向同一父级的子级。
官方JavaDoc for @OneToOne注释包含有关附加参数的更多信息以及有关双向关系的建议。
UPD:链接到有关如何处理@OneToOne
关系的休眠规范:
这意味着在您的B
实体模型上,您应该为您的A
实体添加一个字段,并对其进行注释,@OneToOne(mappedBy="b")
以使您的关系成为双关系的和完整的,从而限制了对单个Parent的访问并创建了唯一约束。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句