2010-02-20 119 views
8

是否有必要將composite-id映射到類?休眠組合鍵

它可以這樣嗎?

<composite-id> 
    <key-property=..../> 
    <key-property=..../> 
</composite-id> 

還是應該

<composite-id class=....> 
    <key-property=..../> 
    <key-property=..../> 
</composite-id> 

應該是必要的,如果我們有複合鍵,然後這個類應該實現equals()override()方法?

回答

26

Hibernate需要能夠比較和序列化標識符。所以標識符類必須是可序列化的,並且重複hashCode()和equals()與數據庫的複合關鍵字相等概念一致。

如果您將複合標識映射爲實體的屬性,則實體本身就是標識。

第二種方法被稱爲映射組合標識符,其中,所述<複合-ID >元件中列出的標識性能上的持久類和一個單獨的標識符類

最後,複合-ID可以都重複是一個組件類。在這種情況下,組件類是標識符類。

請注意,強烈建議將ID設置爲單獨的類別。否則,只有使用session.get()或session.load()來查找對象的方法非常尷尬。

參考文檔的有關章節:

在本例中,複合-ID被映射爲所述實體的屬性。 (以下假設您正在定義Employee類)。

<composite-id> 
    <key-property name="EmployeeNumber"/> 
    <key-property name="Dependent"/> 
</composite-id> 

class EmployeeAssignment implements Serializable 
{ 
    string getEmployeeNumber() 
    void setEmployeeNumber(string value) 
    string getDepartment() 
    void setDepartment(string value) 
    boolean equals(Object obj) 
    int hashCode() 
} 

映射的複合-ID:

<composite-id class="EmployeeAssignmentId" mapped="true"> 
    <key-property name="EmployeeNumber"/> 
    <key-property name="Dependent"/> 
</composite-id> 

class EmployeeAssignment 
{ 
    string getEmployeeNumber() 
    void setEmployeeNumber(string value) 
    string getDepartment() 
    void setDepartment(string value) 
} 

class EmployeeAssignmentId implements Serializable 
{ 
    string getEmployeeNumber() 
    void setEmployeeNumber(string value) 
    string getDepartment() 
    void setDepartment(string value) 
    boolean equals(Object obj) 
    int hashCode() 
} 

A組分作爲複合-ID:

<composite-id name="Id" class="EmployeeAssignmentId"> 
    <key-property name="EmployeeNumber"/> 
    <key-property name="Dependent"/> 
</composite-id> 

class EmployeeAssignment 
{ 
    EmployeeAssignmentId getId() 
    void setId(EmployeeAssignmentId value) 
} 

class EmployeeAssignmentId implements Serializable 
{ 
    string getEmployeeNumber() 
    void setEmployeeNumber(string value) 
    string getDepartment() 
    void setDepartment(string value) 
    boolean equals(Object obj) 
    int hashCode() 
} 
+0

混淆的例子。此外,複合標識符中的「依賴」是什麼?你的意思是把'部門'?無論如何,仍然是一個令人困惑的例子。可以通過解釋它來解釋。 – KyleM

+0

如果你讓實體本身作爲標識符,那麼這是否意味着equals和hashcode只能使用複合ID而不是其他任何字段來檢查相等性? – CowZow

4

兩者都是可能的。如果使用

<composite-id> 
    <key-property=..../> 
    <key-property=..../> 
</composite-id> 

然後,不需要單獨的類來表示鍵。 ID值取自實體本身的屬性。

如果使用

<composite-id class="...."> 
    <key-property=..../> 
    <key-property=..../> 
</composite-id> 

則指定的類將是一個用作關鍵性能的支架。但是,實體類必須具有這些屬性 - 值存儲在實體類和複合ID類。實體類沒有關鍵類的知識。在我看來,這不太好。

有一個更好的第三方法中,在文檔here描述:

<composite-id name="id" class="OrderLineId"> 
    <key-property name="lineId"/> 
    <key-property name="orderId"/> 
    <key-property name="customerId"/> 
</composite-id> 

在這裏,複合密鑰由類OrderLineId表示的,其中的一個實例被存儲在字段id下在實體類。這可以讓實體和密鑰之間的分離更加清潔。

+0

「如果你使用」......你是否想在該行之後放置一些代碼? –

+0

@skaffman,我也在您的doc鏈接上尋找上述邏輯 – Vish

+0

404的代碼。 – orbfish

2

如果你有一個包含到其他實體關係的複合鍵,像這樣做:

<composite-id> 
    <key-many-to-one name="employee" column="FK_EMPLOYEE" entity-name="net.package.name.Employee" /> 
    <key-many-to-one name="department" column="FK_DEPARTMENT" entity-name="net.package.name.Department" /> 
</composite-id> 
+0

不幸的是不起作用,映射異常被拋出:_重複列映射爲entity_。 – mnn