JPA 单向 @OneToOne 和 @ManyToOne 在 Hibernate 中有什么区别 - 不存在吗?

5
根据书籍《Pro JPA 2》所述,@ManyToOne和@OneToOne之间的主要区别在于,在@OneToOne中:

只有源实体的一个实例可以引用同一个目标实体实例。 换句话说,目标实体实例不会在源实体实例之间共享。在数据库中,这意味着在源实体表中具有唯一性约束的源外键列(即源外键列)。

问题是,当我在实体上创建这样的映射并让Hibernate创建模式时,根本没有创建唯一约束。为什么?因为对我来说,如果必须明确定义映射的唯一约束,则@ManyToOne和@OneToOne之间没有区别。我可以为它们两个都这样做,没有任何区别。这是正确的行为吗?
2个回答

8
如果关联是ManyToOne,或者反之,则没有理由使用OneToOne。使用反映关联基数现实情况的适当注释。如果不这样做,将会使应用程序开发人员甚至Hibernate本身感到困惑。
无论源的唯一性在数据库中是否受限,对于Hibernate来说都没有改变。根据我的经验,在OneToOne的情况下Hibernate确实会创建唯一约束,如果没有的话,那么您应该创建它(除了快速而肮脏的演示应用程序之外,我不会使用Hibernate来创建模式)。
但是,如果有一个唯一约束,并且您尝试创建两个具有相同目标实体的不同实体,那么由数据库唯一约束抛出的错误将导致失败。

4
“不这样做只会让应用程序开发人员感到困惑” - 这是我能想到的最好的理由!你能指定创建带有@OneToOne约束的Hibernate版本吗? - user1071076
我最近使用的都是3.6+版本,如果你的数据库方言不同可能会有所不同。 - JB Nizet

3
重要的文本部分是this equates to having a uniqueness constraint。它并不意味着JPA提供程序会为您在两个表上放置唯一约束条件,它仅仅暗示在数据库级别上,一个表中的行只能映射到另一个表中的一行。
一对多一对一之间存在重要的差异,即关系的基数。这意味着在一对多关系中,关系一侧的实体可以通过多侧的外键映射到多个实体。而在一对一关系中,实体仅仅映射到另一个单独的实体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接