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

use*_*076 3 hibernate jpa one-to-one many-to-one

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

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

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

JB *_*zet 5

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

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

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

  • "不这样做只会混淆应用程序的开发人员" - 这是我能想到的最好的理由!你能指定用@OneToOne创建约束的Hibernate版本吗? (3认同)