根据书Pro JPA 2,单向@ManyToOne和@OneToOne之间的主要区别在于@OneToOne:
源实体中只有一个实例可以引用同一个目标实体实例。 换句话说,目标实体实例是 不在源实体实例之间共享。在数据库中,这相当于对数据库具有唯一性约束 源外键列(即源实体表中的外键列)。
问题是,当我在实体上创建这样的映射并让Hibernate创建模式时,根本没有创建唯一约束。为什么?因为对我而言,如果必须为映射显式定义唯一约束,则@ManyToOne和@OneToOne之间没有区别。我可以为他们两个做这件事,但没有任何区别。这是正确的行为吗?
答案 0 :(得分:5)
如果关联是ManyToOne,则没有理由使用OneToOne,反之亦然。使用适当的注释,这反映了关联的基数的现实。不这样做只会混淆应用程序的开发人员,如果不是Hibernate本身。
源的唯一性是否受限于数据库不会改变Hibernate的任何内容。根据我的经验,Hibernate 在OneToOne的情况下创建唯一约束,如果没有,那么你应该创建它(我不会使用Hibernate创建架构,除了一个快速的肮脏的演示应用程序。
但是,当然,如果存在唯一约束,并且您尝试使用相同的目标实体创建两个不同的实体,则由于数据库唯一约束引发的错误而失败。
答案 1 :(得分:3)
文本的重要部分是this equates to having a uniqueness constraint
。它没有推断JPA提供程序会为您在两个表上放置唯一约束。它只是在数据库级别暗示一个表中的行只映射到另一个表中的一行。
One to One
和One to Many
之间存在显着差异,这是关系的基数。在One To Many
关系中的含义,关系一侧的实体可以(通过许多方面的外键)映射到关系的许多方面的许多实体。在One to One
关系中,实体只是映射到另一个单独的实体。