2010-01-29 31 views
35

En mi base de datos MySQL, está la columna "enumeración de género ('masculino', 'femenino')"Enumeración de hibernación, que persiste como una enumeración

he creado mis enumeración com.mydomain.myapp.enums" .Gender ", y en mi entidad Person estoy definido como" Sexo de género ".

Ahora me gustaría mantener el tipo de enumeración en mi base de datos MySQL, pero cuando inicio mi solicitud me sale:

incorrecto tipo de columna en columna MyApp.Person de Género. Encontrado: enum, esperado: entero

¿Por qué es esto? Esto sería el equivalente como si hubiera anotado mi "Género de género" con "@Enumerated (EnumType.ORDINAL)", lo que no he hecho. Parece que EnumType solo puede ser ORDINAL o STRING, entonces, ¿cómo especifico que debería tratar el campo como una enumeración, no como un int? (No es que haya mucha diferencia, pero es suficiente para que se enoje al respecto.)

+0

enteros envío shud funcionan.male = 1, female = 2 – Cherian

+0

Usando Hibernate, ¿cómo sugerirías anotar mi clase de Entidad para hacer eso? Intenté definir explícitamente mis valores enum "enum público Género (MALE (1), FEMALE (2);}" sin diferencia en la salida de error – niklassaers

Respuesta

23

Mi entendimiento es que el tipo de enum de MySQL es muy patentado y no está bien soportado por Hibernate, vea this comment de Gavin King (este problema relacionado es un poco diferente, pero esa no es la parte importante).

Así que, de hecho creo que usted tiene que usar su propia UsereType y se lo recomiendo a utilizar la solución flexible - versión trabajando desde el Java 5 EnumUserType (veo de Java 5 Enums Persistence with Hibernate para un ejemplo AppFuse).

Personalmente, me olvidaría de la idea de usar MySQL enum, no estoy convencido de que los "beneficios" valen la pena (ver this answer para más detalles).

18

intenta utilizar @Enumerated (EnumType.STRING) y definir su enumeración como valores de casos esta

enum Gender { 
    male, 
    female 
} 

Nota inferiores.

Esto funcionará al menos con las columnas VARCHAR. Almacenará enum como cadena 'masculina' o 'femenina'.

+2

Como está escrito, estoy usando la columna de tipo enum, no varchar – niklassaers

+4

¿De verdad? Probé mi sugerencia: el tipo de género en mysql probablemente sea solo un envoltorio/azúcar sintáctico alrededor de una columna varchar o char. –

23

Si usted le da una definición de columna Hibernate, no va a tratar de adivinar una:

@Column(columnDefinition = "enum('MALE','FEMALE')") 
@Enumerated(EnumType.STRING) 
private Gender gender; 

Si no está confiando en hibernación para generar el esquema por cualquier razón, no tienen ni siquiera para proporcionar valores reales para el columnDefinition. De esta forma, elimina una instancia en la que necesita mantener los valores sincronizados. Sólo mantener la enumeración de Java y su Liquibase o secuencia de comandos SQL en sincronía:

@Column(columnDefinition = "enum('DUMMY')") 
@Enumerated(EnumType.STRING) 
private ManyValuedEnum manyValuedEnum; 
3
No

para este caso, pero si alguien está usando mapeo XML:

<property name="state" column="state" not-null="true"> 
    <type name="org.hibernate.type.EnumType"> 
    <param name="enumClass">com.myorg.persistence.data.State</param> 
    </type> 
</property> 

La base de datos Tipo de columna debe ser ejemplo numérico tinyint en un mysql para hacer posible la lectura de valores ordinales.

5

no está seguro de por qué no está en la documentación de Hibernate pero se puede hacer esto

<property name="type" column="type" not-null="true"> 
    <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.a.b.MyEnum</param> 
     <param name="type">12</param> 
     <!-- 12 is java.sql.Types.VARCHAR --> 
    </type> 
</property> 
+0

Thx, esto funciona bien con una columna MySQL ENUM, aunque 12 es para VARCHAR – arun

+0

¿Cómo hacer esto con las anotaciones? – rajadilipkolli

Cuestiones relacionadas