2011-01-14 16 views
6

Tengo una entidad que contiene una propiedad enum. Esa propiedad puede ser cualquiera de mis tipos de enumeraciones en mi base de código:Persistir Java Enum sin procesar usando Hibernate

public enum AutomobileType { 
    CAR, TRUCK, MOTORCYCLE 
} 

public enum BoatType { 
    ROW_BOAT,YACHT,SHIP 
} 

@Entity 
public class FooBar { 

    @Enumerated(value=EnumType.ORDINAL) 
    private Enum enumValue; 

    public void setEnumValue(Enum value) { ... } 
    public Enum getEnumValue() { ... } 
} 

Esta falla con una excepción, "Wrong tipo de datos: Para cadena de entrada: '[B @ f0569a' Me cambió FooBar para almacenar el propiedad como un Integer que funciona, pero eso no es lo que necesito. Necesito la enumeración real. ¿Alguna sugerencia sobre cómo hacer que esto funcione para que el Enum pueda persistir como int pero luego se retiró al tipo Enum correcto?

+0

"¿Alguna sugerencia sobre cómo hacer que esto funcione para que el Enum pueda persistir como int, pero luego se retiró en el tipo de Enum correcto?" - ¿Quiere decir que quiere almacenar "1" y luego recuperarlo como AutomobileType? – jpkrohling

Respuesta

3

Necesita definir un custom UserType para Enum.

+0

Eso no se aplica a JPA, seguramente, solo para Hibernate configurado en XML. – skaffman

+0

Creo que es la única forma de enumeraciones polimórficas, aunque la muestra del código de referencia debe modificarse en consecuencia. – axtavt

+0

Es algo ridículo que JPA no tenga un estándar para realizar enlaces personalizados de columna/propiedad. Tienes que hacerlo manualmente en la entidad al tener dos conjuntos de propiedades y marcar un conjunto como transitorio. –

2

Generalmente, no debe hacer eso. Si se pueden asignar las dos (o más enumeraciones) t o el mismo campo, luego combínalos en un solo anum.

Si está utilizando la herencia, como: Vehicle con dos subclases - Boat y Car, entonces usted puede tener un campo diferente en cada subclase - después de todo, cada una de estas enumeraciones sólo es relevante para el tipo particular. Entonces:

@Column 
private BoatType boatType; 
+0

Esta es la forma correcta de hacerlo. :) –

+0

@Bozho: Quiere almacenar diferentes enumeraciones en la misma propiedad. – axtavt

+0

Creo que OP significa que realmente quiere usar un 'Enum' polimórfico, en lugar de un tipo de enumeración específico. – skaffman

0

No creo que esto pueda funcionar fácilmente con varios tipos de Enum que intentan coexistir en la misma propiedad. ¿Cómo sabe hibernate qué clase Enum debería estar creando instancias cuando carga el campo fuera de la base de datos?

Si realmente desea hacer esto, deberá codificar de alguna manera la clase enum + el valor cada vez que persista en esta propiedad (utilice un UserType personalizado como lo sugiere duffymo).

¿No puedes dividir esto en dos propiedades, una por clase enum? Luego puede declarar enumValue (y enumValue2) como la clase correcta y funcionará de la caja.