2010-02-20 17 views
8

¿Es necesario que la identificación compuesta esté asignada a la clase?clave compuesta de hibernación

¿puede ser así?

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

o debería ser

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

si ello es necesario que si tenemos clave compuesta entonces que la clase debe implementar equals() y override() método?

Respuesta

26

Hibernate debe ser capaz de comparar y serializar los identificadores. Por lo tanto, la clase de identificador debe ser serializable y anular hashCode() y equals() de forma coherente con la noción de igualdad de clave compuesta de la base de datos.

Si tiene una identificación compuesta mapeada como propiedades de la entidad, la entidad misma es el identificador.

Un segundo enfoque se denomina un identificador compuesto mapeado, donde las propiedades identificador denominado dentro de la > elemento < composite-id se duplican en tanto la clase persistente y una clase de identificador separado

Finalmente, un composite-id puede ser una clase componente. En este caso, la clase de componente es la clase de identificador.

Tenga en cuenta que se recomienda encarecidamente que el ID sea una clase separada. De lo contrario, solo tendrá formas muy incómodas de buscar su objeto utilizando session.get() o session.load().

secciones pertinentes de la documentación referencia:

En este ejemplo, un material compuesto de ID se asignan como propiedades de la entidad. (Lo siguiente asume que está definiendo la clase Empleado).

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

Un mapeado 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 como un composite-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

ejemplo confuso. también, ¿qué es 'dependiente' en el ID compuesto? ¿Querías poner 'departamento'? de cualquier manera, sigue siendo un ejemplo confuso. podría aclararse con comentarios para explicarlo. – KyleM

+0

Si deja que la entidad misma sea el identificador, ¿significa eso que los iguales y el código hash solo pueden usar las ID compuestas y no otros campos para verificar la igualdad? – CowZow

4

Ambos son posibles. Si usa

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

Entonces no se requiere una clase separada para representar la clave. Los valores de ID se toman de las propiedades de la entidad misma.

Si utiliza

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

Entonces la clase especificada habrá una utilizarse como un soporte para las propiedades clave. Sin embargo, la clase de entidad debe también tener estas propiedades: los valores se almacenan tanto en la clase de entidad como en la clase de ID compuesta. La clase de entidad no tiene conocimiento de la clase de clave. No es muy agradable, en mi opinión.

Hay una tercera enfoque más agradable, que se describe en la documentación here:

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

Aquí, la clave compuesta está representada por la clase OrderLineId, una instancia de los cuales se almacena en el campo id en la clase de entidad . Esto mantiene la separación entre entidad y clave mucho más limpia.

+0

"Si usa" ... ¿quiso poner un código después de esa línea? –

+0

@skaffman, también estoy buscando un código para la lógica de arriba – Vish

+0

404 en su enlace de documento. – orbfish

2

Si tiene una clave compuesta que contiene relaciones con otras entidades, hacerlo de esta manera:

<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

Lamentablemente no funciona, se genera la excepción de asignación: _ Columna repetida en el mapeo para entity_. – mnn

Cuestiones relacionadas