2009-10-20 11 views
16

Necesito asignar las enumeraciones que no implementaron la interfaz de antemano a la base de datos existente, que almacena enumeraciones en la misma tabla que la clase propietaria que usa el @Enumerated(EnumType.STRING).Hibernate enumeración de enum

class A { 
    HasName name; 
} 

interface HasName { 
    String getName(); 
} 

enum X implements HasName { 
    John, Mary; 

    public String getName() { return this.name(); } 
} 

enum Y implements HasName { 
    Tom, Ann; 

    public String getName() { return this.name(); } 
} 

¿Cómo debe manejarse el mapeo en este caso? Persistir en la base de datos no cambia, ya que todas las enumeraciones que implementan la interfaz tendrán diferentes valores, pero no estoy seguro de cómo se deben recuperar los objetos de la base de datos (¿necesito un asignador personalizado, que intentará crear una instancia de un enum utilizando las clases de enumeración especificadas? ¿Hibernate admite de forma nativa esta funcionalidad?).

Respuesta

7

Es posible crear una costumbre UserType (por ejemplo this one) y utilizarlo desde sus asignaciones

<property name="type" not-null="true"> 
    <type name="at.molindo.util.hibernate.EnumUserType"> 
    <param name="enumClass"> 
     com.example.MyEnum 
    </param> 
    </type> 
</property> 

EDIT: Hibernate viene con su propia EnumType (desde 3.2 en hibernación-anotaciones, desde 3,6 en hibernación núcleos - no sabía que estaba en anotaciones de hibernación en el momento de escribir, pero vea Diego's answer).

+0

En mi caso, yo no sé lo que será la clase de la enumeración. Al crear instancias de 'A', Hibernate deberá elegir una de las enums {X, Y}. – dm3

+0

No debería ser tan difícil ajustar la implementación de UserType de ejemplo a sus necesidades. Por ejemplo, en lugar de almacenar solo el valor, también puede almacenar la clase (por ejemplo, com.example.X.John o X.John, pero de lo que necesitará una asignación de X a com.example.X) – sfussenegger

+0

Significa I necesita un mapeador personalizado (no vio su enlace para pegar). Gracias por la respuesta. – dm3

50

Hibernate proporciona org.hibernate.type.EnumType para mapear los tipos enumerados. Por ejemplo,

package com.igalia.enumerates; 

public enum Status { 
    BUSY, 
    AVAILABLE; 
} 

package com.igalia.entities; 

class MyClass { 
    private Status status; 
} 

A continuación, hacer su mapeo Hibernate como sigue:

<class name="MyClass"> 
    <id name="id"> 
     <generator class="native"/> 
    </id> 

    <property name="status"> 
     <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.igalia.enumerates.Status</param> 
     </type> 
    </property> 
</class> 

Y eso es todo. Si prefiere usar las anotaciones JPA en lugar de hbm.xml, use @Enumerated (EnumType.STRING). Hay que ver aquí:

Enumerations in Hibernate

+0

¿Cómo se establece un valor predeterminado para eso? Agregué el siguiente elemento a pero eso no funcionó para mí: Timo

+1

@valmar puede inicializar * estado * a nivel de clase (o hacerlo en su constructor). Por ejemplo, 'estado de estado privado = Estado. BÚSQUEDA;' –

Cuestiones relacionadas