2011-12-20 44 views
0

在這樣一個簡化的情況下,有3類:Hibernate的註解對於N ----關於與關聯數據N的關係

class ClassONE{ 

    protected List<IntermediatedClass>; 

    (... getters/setters) 

} 

class ClassTWO 

protected String someData; 

(... getters/setters/iniciate List etc...) 

} 

class IntermediatedClass{ 

public ClassONE one; //Points to an object (row) of ClassONE 
public ClassTWO two; //Points to an object (row) of classTWO. 
public Double data; //Data that need being saved with this particular relation between obj1 and obj2. 

} 

我知道,與Hibernate可以聲明之間的多對多關係單向class1和class2。 Class1可以有一些class2的對象,class2可以在一些class1的對象上。那只是[CLASS1] N ---- N [CLASS2]。

我想聲明一個[CLASS1] 1 --- N [INTERMEDIATECLASS] N --- 1 [CLASS2]典型的N-N數據庫實現。中級類有一個非常重要的屬性:data,一個Double類型。我無法找到將IntermediateClass聲明爲我自己的方式來在Hibernate Annotations中使用此數據實現此N-N。

請幫忙嗎?就這個簡單的例子我可以解決我的麻煩。我沒有做出我的嘗試,以便爲了理解而保持清潔代碼。

回答

2

您可以創建一個完全成熟的雙向許多一對多映射與附加屬性中間測繪類,你會設計你的ER模型以同樣的方式:

class A { 
    private List<AB> ab; 

    @OneToMany(mappedBy = "a") 
    public List<AB> getAb() {...} 
} 

class B { 
    private List<AB> ab; 

    @OneToMany(mappedBy = "b") 
    public List<AB> getAb() {...} 
} 

和映射類:

class AB { 
    private A a; 
    private B b; 
    private double data; 

    @ManyToOne 
    @JoinColumn 
    public A getA() {...} 

    @ManyToOne 
    @JoinColumn  
    public B getB() {...} 

    @Column 
    public double getData() {...} 
} 

但是由於像這樣的雙向關聯可能會變得相當混亂並且很難在應用程序代碼中維護,所以我會在沒有雙向關聯的情況下完成,並且只需在AB類中定義兩個單向多對一關聯。

+0

我會嘗試與多對一集中我的AB類。只是一個問題:爲什麼你要在getter方法上面定義註釋而不在屬性上面?我已經看到,在Hibernate文檔中他們喜歡這樣做,並且我在屬性上面聲明瞭註釋。關於這個的一些提示? – Raph 2011-12-20 21:03:36

+1

您可以在字段或獲取者上定義註釋,這取決於您。但是我認爲你必須堅持類層次結構中的一個或另一個約定。如果您在字段上定義了「@ Id」註釋,則必須在字段上定義所有註釋。如果你在getter上定義'@ Id',那就是所有的getter。另外請注意,如果你註釋了getters,你需要一個setter(可能是私有的)。只有當您將@AccessType(「field」)添加到getter時,您纔不需要setter。 – tscho 2011-12-20 21:16:00

+0

簡而言之,我必須用AB類中的註釋手動定義[A] 1 --- N [AB] N --- 1 [B]。是的,這是最好的方法。我認爲我有辦法在@ManyToMany選項集上定義所有這個結構。謝謝 – Raph 2011-12-21 10:09:36