2010-02-20 13 views
8

È necessario che l'ID composito debba essere mappato alla classe ??hibernate chiave composita

può essere così?

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

o dovrebbe essere

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

qualora fosse necessario che se abbiamo chiave composta allora tale classe dovrebbe implementare equals() e override() metodo?

risposta

26

Hibernate deve essere in grado di confrontare e serializzare gli identificatori. Quindi la classe identificatore deve essere serializzabile e sovrascrivere hashCode() ed equals() coerentemente con la nozione di equità di chiave composita del database.

Se si dispone di un ID composito mappato come proprietà dell'entità, l'entità stessa è l'identificatore.

Un secondo approccio è chiamato un identificatore composito mappata, dove le proprietà identificatore denominate all'interno del < composite-id > elemento sono duplicati sia sulla classe persistente e una classe identificatore separato

Infine, un composito-id può essere una classe componente. In questo caso la classe componente è la classe identificatore.

Si noti che si consiglia vivamente di avere l'ID una classe separata. Altrimenti avrete solo modi molto imbarazzanti per cercare il vostro oggetto usando session.get() o session.load().

sezioni pertinenti del documentazione Reference:

In questo esempio, un composito-id è mappato come proprietà dell'entità. (Quanto segue presuppone che si stia definendo la classe 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 mappato composite-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() 
} 

Un componente come un composito-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

confondendo esempio. inoltre, cosa è 'dipendente' nell'ID composito? intendevi mettere 'dipartimento'? in entrambi i casi, ancora un esempio confuso. potrebbe essere chiarito facendo commenti per spiegarlo. – KyleM

+0

Se si lascia che l'entità sia l'identificatore, vuol dire che l'uguaglianza e l'hashcode possono usare solo l'ID composito e non altri campi per verificare l'uguaglianza? – CowZow

4

Entrambi sono possibili. Se si utilizza

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

Quindi non è richiesta alcuna classe separata per rappresentare la chiave. I valori ID sono presi dalle proprietà dell'entità stessa.

Se si utilizza

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

Poi la classe specificata sarà una utilizzata come supporto per le proprietà chiave. Tuttavia, la classe di entità deve anche avere queste proprietà - i valori vengono memorizzati sia nella classe di entità che nella classe di ID composito. La classe di entità non ha conoscenza della classe chiave. Non molto bello, secondo me.

C'è un approccio 3a migliore, descritti nella documentazione here:

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

Qui, la chiave composita è rappresentato dalla classe OrderLineId, un'istanza che è memorizzato sotto il campo id nella classe entità . Ciò mantiene la separazione tra entità e chiave molto più pulita.

+0

"Se usi" ... intendevi inserire del codice dopo quella linea? –

+0

@skaffman, sto anche cercando il codice per la logica precedente – Vish

+0

404 sul tuo link doc. – orbfish

2

Se si dispone di una chiave composita che contiene relazioni con altre entità, fare in questo modo:

<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

Purtroppo non funziona, viene generata un'eccezione di mappatura: _Repeated column in mapping for entity_. – mnn

Problemi correlati