JPA unidirectional @OneToOne vs @ManyToOne与Hibernate - 没什么区别?

时间:2014-02-14 21:23:12

标签: hibernate jpa one-to-one many-to-one

根据书Pro JPA 2,单向@ManyToOne和@OneToOne之间的主要区别在于@OneToOne:

  

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

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

2 个答案:

答案 0 :(得分:5)

如果关联是ManyToOne,则没有理由使用OneToOne,反之亦然。使用适当的注释,这反映了关联的基数的现实。不这样做只会混淆应用程序的开发人员,如果不是Hibernate本身。

源的唯一性是否受限于数据库不会改变Hibernate的任何内容。根据我的经验,Hibernate 在OneToOne的情况下创建唯一约束,如果没有,那么你应该创建它(我不会使用Hibernate创建架构,除了一个快速的肮脏的演示应用程序。

但是,当然,如果存在唯一约束,并且您尝试使用相同的目标实体创建两个不同的实体,则由于数据库唯一约束引发的错误而失败。

答案 1 :(得分:3)

文本的重要部分是this equates to having a uniqueness constraint。它没有推断JPA提供程序会为您在两个表上放置唯一约束。它只是在数据库级别暗示一个表中的行只映射到另一个表中的一行。

One to OneOne to Many之间存在显着差异,这是关系的基数。在One To Many关系中的含义,关系一侧的实体可以(通过许多方面的外键)映射到关系的许多方面的许多实体。在One to One关系中,实体只是映射到另一个单独的实体。