tablas mapeo mapear ejemplo configurar hibernate enums hibernate-mapping hbm

mapeo - mapear tablas hibernate eclipse



Agregar una enumeración como propiedad de clase en HBM (6)

Solo edito @Emmanuel Bourg responde y agrega otro <param> como este:

<class name="a.b.c.myObject" table="OBJECT"> <property name="myEnum" column="EXAMPLE"> <type name="org.hibernate.type.EnumType"> <param name="enumClass">a.b.c.myEnum</param> <param name="type">12</param> </type> </property> </class>

12 es equivalente a java.sql.Types.VARCHAR

Estoy tratando de crear una clase en el archivo HBM que contiene un Enum como campo.

El HBM es similar a esto:

<class name="a.b.c.myObject" table="OBJECT" > <property name="myEnum" column="EXAMPLE" type="a.b.c.myEnum" /> </class>

y digamos que este es el Enum:

public enum myEnum{ a, b, c; }

El problema es que en el DB esperaba ver el valor String de esa enumeración (a, boc), pero en cambio obtuve los datos brutos de ese campo.

¿Cómo puedo resolver eso?


1) Solución fácil: use Anotaciones de Hibernate en lugar de mapeos basados ​​en XML. El soporte de Enum está incorporado :

@Entity public class MyObject { @Enumerated(EnumType.STRING) @Column(name="EXAMPLE") private MyEnum myEnum; }

2) Si no puede usar las anotaciones, puede usar el EnumType que proporcionan en las asignaciones basadas en XML. Debe tener hibernate-annotations.jar apropiado en su classpath durante la implementación, pero no hay dependencia en tiempo de compilación:

<class name="a.b.c.myObject" table="OBJECT" > <property name="myEnum" column="EXAMPLE" type="org.hibernate.type.EnumType"/> </class>



Por razones que siguen siendo poco claras, los desarrolladores de Hibernate insisten en mantener el núcleo de Hibernate compatible con pre-Java5, y eso significa que no hay soporte enum. Cuando intentas persistir en un campo Enum, simplemente lo serializa y obtienes datos binarios.

Si desea persistir enums utilizando una configuración de asignación de .hbm, debe crear y configurar un UserType personalizado para cada tipo de enumeración que desee controlar, lo cual es tedioso e irritante. La wiki de documentación de Hibernate tiene muchos ejemplos, muchos de los cuales parecen contradecirse, y algunos incluso funcionan.

Sin embargo, si usas anotaciones de Hibernate, obtienes la compatibilidad total de java5, incluido el manejo automático de las enumeraciones de java5. Es una verdadera lástima que tengas que hacer una cosa o la otra.


Aquí está la solución con Hibernate 3.6.x:

<class name="a.b.c.myObject" table="OBJECT"> <property name="myEnum" column="EXAMPLE"> <type name="org.hibernate.type.EnumType"> <param name="enumClass">a.b.c.myEnum</param> </type> </property> </class>


Similar a la respuesta de @monim, pero de una manera más elegante:

<class name="a.b.c.myObject" table="OBJECT"> <property name="myEnum" column="EXAMPLE"> <type name="org.hibernate.type.EnumType"> <param name="enumClass">a.b.c.myEnum</param> <param name="useNamed">true</param> </type> </property> </class>