Hibernate映射混淆

时间:2011-02-23 17:57:14

标签: java hibernate

以下定义取自Hibernate association mapping tutorial here

每本图书都与一位出版商有关,而一位出版商可能会出版多本图书。

我在Java中用以下方式表示上面的定义

class Book
{
  Publisher pub;
}

class Publisher
{
  Set<Book> books;
}

问题1.现在我很困惑为什么教程说从书到出版商的关联被称为“多对一”关联。我想发布商和图书之间存在“一对多”关联,这是正确的做法。

问题2.以下是Book的hbm。为什么我们不应该在Publisher的hbm映射中声明一对多。是什么决定了这种关系映射的位置?

<class name="Book" table="BOOK"> 
  <many-to-one name="publisher" class="Publisher" column="PUBLISHER_ID" /> 
</class>

4 个答案:

答案 0 :(得分:2)

这取决于关系是否是双向的。请参见此处的第7.3.2节http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-mapping

双向关系是指您可以从父级到子级(即Publisher - &gt; Book)以及从子级到父级(即Book - &gt; Publisher)。孩子的父母是一对多的,而父母的孩子是多对一的。

请注意,您不需要双向关系。 “正确的方法”完全取决于您的应用程序需求。如果你只需要从pu.lisher到预订,你只需要一对多。如果您只需要从书籍到出版商,那么您只需要多对一。如果你需要两者,你可以同时拥有(即双向关系)/

答案 1 :(得分:1)

BookPublisher的关联多对一,因为每个发布商可能有多个图书。这与Book只知道自己Publisher的事实无关。该关联是为了帮助Hibernate理解底层表示。

PublisherBook声明一对多关系也没有错。你可以同时出席。这取决于您的数据模型以及您计划如何与其进行交互。

答案 2 :(得分:1)

问题1:实际上两者都是正确的。这取决于关系的方向。许多书籍属于一个出版商,从书本方面产生了多对一的关系。

问题2:如果您对双向关系感兴趣,那么您实际上可以在一侧放置一对多,在另一侧放置多对一。但是,您必须小心使用mappedBy属性以确保hibernate知道它从两端定义了相同的关系。

答案 3 :(得分:1)

关系可以是单向的,也可以是双向的。

您在Java代码中设计它的方式,它是双向的。这意味着相同的物理关系(由外键实现)被视为两个逻辑关系:

  1. 从书的角度来看:一本出版社出版了几本书(ManyToOne)
  2. 从出版商的角度来看:一家出版商出版了几本书(OneToMany)
  3. 您在问题中显示的XML映射描述了关系的一个方面。但是如果你想让它成为双向的,你还必须声明另一方。其中一方被宣布为另一方的反面。

    Hibernate为您提供了选择:您可以在发布者类中拥有一组书籍(单向一对多),或者书籍类中的发布者参考(多对一单向),或两者兼而有(双向一对多/多对一)。

    阅读the documentation了解更多详情。