JPA单向@OneToOne与@ManyToOne搭配Hibernate-没有区别?
根据这本书,单向@ManyToOne和@OneToOne的主要区别在于@OneToOne: 源实体的一个实例只能引用同一个目标实体实例。 换句话说,目标实体实例是 未在源实体实例之间共享。在数据库中,这相当于对 源外键列(即源实体表中的外键列)JPA单向@OneToOne与@ManyToOne搭配Hibernate-没有区别?,hibernate,jpa,one-to-one,many-to-one,Hibernate,Jpa,One To One,Many To One,根据这本书,单向@ManyToOne和@OneToOne的主要区别在于@OneToOne: 源实体的一个实例只能引用同一个目标实体实例。 换句话说,目标实体实例是 未在源实体实例之间共享。在数据库中,这相当于对 源外键列(即源实体表中的外键列) 问题是,当我在实体上创建这样一个映射并让Hibernate创建模式时,根本没有创建唯一的约束。为什么?正因为如此,如果我必须显式定义映射的唯一约束,@ManyToOne和@OneToOne之间没有区别。我可以为他们俩做,这没有什么区别。这是正确的行为吗?
问题是,当我在实体上创建这样一个映射并让Hibernate创建模式时,根本没有创建唯一的约束。为什么?正因为如此,如果我必须显式定义映射的唯一约束,@ManyToOne和@OneToOne之间没有区别。我可以为他们俩做,这没有什么区别。这是正确的行为吗?文本的重要部分是
,这等同于具有唯一性约束。这并不意味着JPA提供者将为您在两个表上放置唯一约束。它仅仅意味着在数据库级别,一个表中的一行将只映射到另一个表中的一行
一对一
和一对多
之间存在显著差异,即关系的基数。意思是在一对多关系中,关系一侧的实体可以映射(通过多侧的外键)到关系多侧的多个实体。在一对一关系中,实体只是映射到另一个单独的实体。如果关联是多个实体,则没有理由使用OneToOne,反之亦然。使用适当的注释,它反映了关联基数的真实性。不这样做只会让应用程序的开发人员感到困惑,如果不是休眠的话
对于Hibernate,源的唯一性是否在数据库中受到约束不会改变任何东西。根据我的经验,Hibernate确实会在OneToOne的情况下创建唯一约束,如果没有,那么您应该创建它(我不会使用Hibernate来创建模式,除了一个quick'n dirty demo应用程序)
但是,当然,如果存在唯一约束,并且您尝试使用相同的目标实体创建两个不同的实体,那么将由于数据库唯一约束引发的错误而失败。“不这样做只会让应用程序的开发人员感到困惑”-这是我能想到的最好理由!你能指定Hibernate的版本来创建带有@OneToOne的约束吗?我最近使用的所有版本都是IIRC。3.6+. 这也可能取决于您的数据库方言。