Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA单向@OneToOne与@ManyToOne搭配Hibernate-没有区别?_Hibernate_Jpa_One To One_Many To One - Fatal编程技术网

JPA单向@OneToOne与@ManyToOne搭配Hibernate-没有区别?

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之间没有区别。我可以为他们俩做,这没有什么区别。这是正确的行为吗?

根据这本书,单向@ManyToOne和@OneToOne的主要区别在于@OneToOne:

源实体的一个实例只能引用同一个目标实体实例。 换句话说,目标实体实例是 未在源实体实例之间共享。在数据库中,这相当于对 源外键列(即源实体表中的外键列)


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

文本的重要部分是
,这等同于具有唯一性约束。这并不意味着JPA提供者将为您在两个表上放置唯一约束。它仅仅意味着在数据库级别,一个表中的一行将只映射到另一个表中的一行


一对一
一对多
之间存在显著差异,即关系的基数。意思是在一对多关系中,关系一侧的实体可以映射(通过多侧的外键)到关系多侧的多个实体。在一对一关系中,实体只是映射到另一个单独的实体。

如果关联是多个实体,则没有理由使用OneToOne,反之亦然。使用适当的注释,它反映了关联基数的真实性。不这样做只会让应用程序的开发人员感到困惑,如果不是休眠的话

对于Hibernate,源的唯一性是否在数据库中受到约束不会改变任何东西。根据我的经验,Hibernate确实会在OneToOne的情况下创建唯一约束,如果没有,那么您应该创建它(我不会使用Hibernate来创建模式,除了一个quick'n dirty demo应用程序)


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

“不这样做只会让应用程序的开发人员感到困惑”-这是我能想到的最好理由!你能指定Hibernate的版本来创建带有@OneToOne的约束吗?我最近使用的所有版本都是IIRC。3.6+. 这也可能取决于您的数据库方言。