JPA一对一关系创建一个非唯一的外键

迪茨

我有以下实体:

@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父级拥有)实体添加注释,并@OneToOne(mappedBy="...")子级实体添加注释

这将在您的id上创建唯一约束

否则,您将建模两个不同的关系,而不是一个双向关系。因此,没有什么可以阻止当前模型具有两个指向同一父级的子级。

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

UPD:链接到有关如何处理@OneToOne关系的休眠规范

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

就你而言

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

一对一关系的外键

来自分类Dev

EF:一对一关系中的外键?

来自分类Dev

JPA一到一个关系创建一个非唯一的外键

来自分类Dev

仅使用一个主键创建一对一关系

来自分类Dev

原则可为空的一对一关系仍要创建唯一索引

来自分类Dev

JPA查询一对一关系

来自分类Dev

Hibernate / JPA一对一关系

来自分类Dev

如何配置一对一关系以使外键也成为主键?

来自分类Dev

一对一关系,将外键放在主表还是从表中?

来自分类Dev

是否可以在EF中以一对一关系分配外键?

来自分类Dev

SQL 表:与自身创建一对一关系?

来自分类Dev

插入一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系插入

来自分类Dev

休眠一对一关系

来自分类Dev

建立一对一关系

来自分类Dev

GSON一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系

来自分类Dev

MYSQL一对一关系

来自分类Dev

实现一对一关系

来自分类Dev

与查询的一对一关系

来自分类Dev

laravel一对一关系作为一个对象返回

来自分类Dev

JPA:如何保存具有一对一关系的两个实体?

来自分类Dev

如何在bash中的两个循环之间创建一对一关系?

来自分类Dev

哪个表具有一对一关系中的外键有关系吗?

来自分类Dev

一对零或一对一关系中的重复键和表字段

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系