En mi base de datos MySQL, hay la columna de «género enum(‘masculino’,’femenino’)»

He creado mi enum «com.mydomain.myapp.las enumeraciones.De género», y en mi Person entidad estoy definido «género Género».

Ahora me gustaría mantener el tipo de enumeración en mi base de datos MySQL, pero cuando ejecuto mi aplicación de recibir:

Equivocado tipo de columna en MyApp.Persona para la columna de Género. Encontrado: enum, que se espera: integer

¿Por qué es esto? Esto sería el equivalente a como si yo la hubiera anotado mi «género Género» con «@Enumerados(EnumType.ORDINAL)», que no lo he hecho. EnumType parece sólo para ser capaz de ser ORDINALES o de CADENA, así que ¿cómo puedo especificar que se debe tratar el campo como una enumeración, no como un int? (no es que haya mucha diferencia, pero suficiente para que se molestan por ella).

  • el envío de los números enteros shud trabajo. hombre = 1 , mujer = 2
  • Usando Hibernate, ¿cómo sugieren puedo anotar a mi clase de Entidad para hacer eso? He tratado de definir mi enumeración de valores de manera explícita «public enum Género ( MASCULINO(1), MUJER(2); }» con ninguna diferencia en la salida de error
InformationsquelleAutor niklassaers | 2010-01-29

5 Comentarios

  1. 26

    Mi entendimiento es que MySQL tipo enum es muy privativo y no está bien soportado por Hibernate, ver este comentario de Gavin King (este tema relacionado es un poco diferente, pero esa no es la parte importante).

    Así que, en realidad creo que tendrás que utilizar tu propio UsereType y te recomiendo usar el solución Flexible – versión de trabajo de la Java 5 EnumUserType (ver Appfuse Java 5 Enumeraciones Persistencia con Hibernate para un ejemplo).

    Personalmente, me acaba de olvidar la idea de usar MySQL enum, no estoy convencido de que los «beneficios» son la pena (ver esta respuesta para más detalles).

  2. 24

    Si quieres dar de Hibernación de la definición de una columna, no va a tratar de adivinar uno:

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

    Si usted no depender de Hibernación para generar el esquema por cualquier razón, usted incluso no tiene que proporcionar los valores reales de la columnDefinition. De esta manera, se elimina una instancia en la que usted necesita para mantener los valores de sincronización. Sólo mantén tus Java enum y su Liquibase o secuencia de comandos SQL en la sincronización:

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

    Intentar usar @Enumerados(EnumType.CADENA) y definir su enum como este

    enum Gender {
      male,
      female
    }

    Nota minúsculas valores.

    Esto va a funcionar, al menos, con las columnas VARCHAR. Va a la tienda enum como cadena de «macho» o «hembra».

    • Como está escrito, estoy usando el tipo de enumeración de la columna, no varchar
    • Has probado mi sugerencia? género tipo en mysql es, probablemente, sólo algunos de envoltura/azúcar sintáctico alrededor de un varchar o columna de tipo char.
  4. 5

    no sé por qué no está en la documentación de Hibernate
    pero usted 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>
    • Thx, esto funciona bien con una base de datos MySQL ENUM columna, a pesar de que 12 es de tipo VARCHAR
    • Cómo hacer esto con las anotaciones?
  5. 4

    No para este caso, pero si alguien está utilizando XML de mapeo:

    <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 de la columna debe ser de tipo numérico, por ejemplo, de tipo tinyint en una base de datos mysql para hacer la lectura de los valores ordinales posible.

Dejar respuesta

Please enter your comment!
Please enter your name here