2011-02-23 114 views
1

下面的定義是從Hibernate association mapping tutorial hereHibernate映射混亂

每本書都涉及到一個出版商,而採取的一個發行商可能會發布很多書。

我想代表上述定義以下方式在Java中

class Book 
{ 
    Publisher pub; 
} 

class Publisher 
{ 
    Set<Book> books; 
} 

問題1:我現在很困惑,爲什麼教程說從書出版商的關聯被稱爲「多對一」協會。我以爲有一個「一對多」出版商和書籍之間的關聯本來就是正確的做法。

問題2.下面是Book的hbm。爲什麼我們不應該在發佈商的hbm映射中聲明一對多?什麼決定了這種關係映射的位置?

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

回答

1

該協會從BookPublisher多到一個,因爲可以有每個出版商許多書。這與Book只知道它自己的Publisher這一事實無關。該關聯是爲了幫助Hibernate理解底層表示。

PublisherBook也宣告一對多關係沒有任何問題。你可以有兩個禮物。這取決於您的數據模型以及您計劃如何與之交互。

2

這取決於關係是否是雙向的。請參閱第7.3.2節http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-mapping

雙向關係是指您可以從父級到子級(即Publisher - > Book)以及從子級到父級(即Book - > Publisher)時的雙向關係。孩子的父母是一對多的,而父母的孩子則是多對一的。

請注意,您不需要雙向關係。 「正確的做法」完全取決於您的應用程序需要什麼。如果你只需要從pu.lisher去預訂,你只需要一對多。如果你只需要從書籍到出版商,那你只需要多對一。如果你既需要,你可以有兩種(即使關係雙向)/

1

問題1:其實兩者都是正確的。這取決於關係的方向。許多書籍屬於一個出版商,從書中獲得多對一的關係。

問題2:如果您對雙向關係感興趣,那麼您實際上可以在一邊放置一對多而另一邊放置多對一。但是,您必須小心使用mappedBy屬性來確保hibernate知道它從兩端定義的相同關係。

1

關係可以是單向的,也可以是雙向的。

您在Java代碼中設計它的方式是雙向的。這意味着,在相同的物理關係(由外鍵物化)被視爲兩個邏輯關係:

  1. 從賬面上看:幾本書是由一個發佈者(多對一)
  2. 從出版商出版觀點:一個發佈者發佈幾本書(OneToMany)

您在問題中顯示的XML映射描述關係的一側。但是如果你想使它成爲雙向的,你還必須聲明另一面。其中一方被宣佈爲另一方的反面。 Hibernate爲您提供了以下選擇:您可以在發佈者類(單向一對多)或書類中的發佈者引用(單向多對一)或兩者兼有(雙向一對多/多對一)。

閱讀the documentation瞭解更多詳情。