代码之家  ›  专栏  ›  技术社区  ›  user1071076

JPA单向@OneToOne vs@ManyToOne with Hibernate-没有区别?

  •  5
  • user1071076  · 技术社区  · 11 年前

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

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

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

    2 回复  |  直到 11 年前
        1
  •  8
  •   JB Nizet    11 年前

    如果关联是ManyToOne,则没有理由使用OneToOne,反之亦然。使用适当的注释,它反映了关联基数的实际情况。不这样做只会让应用程序的开发人员感到困惑,如果不是Hibernate本身的话。

    无论源的唯一性是否在数据库中受到约束,都不会对Hibernate产生任何影响。根据我的经验,Hibernate 在OneToOne的情况下创建唯一约束,如果没有,那么应该创建它(我不会使用Hibernate创建模式,除了一个快速的脏演示应用程序)。

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

        2
  •  3
  •   Kevin Bowersox    11 年前

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

    One to One 和一个 One to Many ,关系的基数。在a中的含义 One To Many 关系关系的一侧的实体可以(通过多侧的外键)映射到关系的多侧的多个实体。在一个 一对一 实体之间的关系简单地映射到另一个单独的实体。