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()
}
混淆的例子。此外,複合標識符中的「依賴」是什麼?你的意思是把'部門'?無論如何,仍然是一個令人困惑的例子。可以通過解釋它來解釋。 – KyleM
如果你讓實體本身作爲標識符,那麼這是否意味着equals和hashcode只能使用複合ID而不是其他任何字段來檢查相等性? – CowZow