2010-02-20 3 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 월 모두 중복되는 두 번째 방법은 매핑 복합 식별자라고

, 컴포넌트 클래스가 될 수 있습니다. 이 경우 구성 요소 클래스는 식별자 클래스입니다.

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() 
} 

A는 복합 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() 
} 

복합-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

예를 혼란. 또한 composite-id에 '종속'이란 무엇입니까? '부서'를 넣으려고 했습니까? 어느 쪽이든, 여전히 혼란스러운 예입니다. 그것을 설명하는 설명을함으로써 명확해질 수있다. – KyleM

+0

엔티티 자체가 식별자가되게하면 equals 및 hashcode는 복합 ID의 to를 사용할 수 있고 다른 필드는 같지 않음을 확인할 수 있습니까? – 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

아쉽게도 작동하지 않습니다. 매핑 예외가 발생합니다. _ 엔티티 매핑의 _Repeated 열. – mnn