2010-11-30 123 views
0

我有點卡住定義一個Hibernate實體:休眠:多FK關係

假設我有一個數據庫中的以下兩個表:

(A)

  • fromCompany
  • toCompany
  • viaCompany

(B)

  • companyID(PK)
  • 描述

其中的元件(A)指向(B)的主鍵;所以FK和PK之間有3個一對一的關係。 我認爲3個OneToOne語句具有不同的mappedBy條件不是要走的路,mh?已經漫長的一天 - 我可能只是不明白;)

感謝您的幫助!

+1

這是絕對OneToOne,而不是多對一?如果表A是可以說發貨表,那麼表B中的一家公司只發貨一件? – Qwerky 2010-11-30 15:40:20

回答

0

如果我理解正確的話,你希望你的數據庫是這樣的:

tableA 
- id 
- fromCompanyId (references tableB.id) 
- toCompanyId (references tableB.id) 
- viaCompanyId (references tableB.id) 

tableB 
- id 
- description 

如果是這樣,你可以肯定這一點。您只需要重寫關係的默認列名稱,以便每個關聯都有自己的列名稱,而不是返回到默認名稱,這會使三個關聯具有相同的名稱,從而導致出現問題。

我並不完全同意OneToOne,但我認爲這是一個有意識的決定。

看到這個: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

+0

非常感謝你 - 現在睡了幾個小時後,我重新思考了自己的能力;)並且感到有些懊惱你。 – henning 2010-12-01 10:06:06

0

你當然可以用一對一的關係做到這一點。你將在你的A類中有三個公司對象和適當的映射。

如果我們能看到代碼和hibernate映射,這將有所幫助。

0

實現帶3間多對一的關係類指着ClassB的

@Entity 
class ClassA { 

    //@ID 
    //private id; 

    @ManyToOne 
    private ClassB from; 

    @ManyToOne 
    private ClassB toCompany; 

    @ManyToOne 
    private ClassB viaCompany; 
} 

是行不通的,因爲每一個實體需要一個ID最簡單的方式。 - 您可以嘗試通過使用組合ID(由三個關聯組成)來克服這個問題,但是我想這會導致很多麻煩來實現由與其他實體關聯組成的ID。

@see Hibernate/persistence without @Id

Hibernate提供了另一種方法是所謂的三元協會。 - 在這種情況下,您以三元m:n關係的形式爲完整表A建模。 - 但這也是一項非常複雜的任務。

@see http://docs.jboss.org/hibernate/core/3.5/reference/en/html/collections.html#collections-ternary