type mapear enumerated enum data annotation java hibernate mapping enums

java - mapear - Mapeo enumeración de hibernación



mapear enum jpa (2)

Necesito asignar las enumeraciones que no implementaron la interfaz de antemano a la base de datos existente, que almacena las enumeraciones en la misma tabla que la clase del propietario utilizando @Enumerated(EnumType.STRING) .

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 se debe manejar el mapeo en este caso? La persistencia en la base de datos no cambia, ya que todas las enumeraciones que implementan la interfaz tendrán valores diferentes, 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 enumeración utilizando las clases de enumeración especificadas? ¿Hibernate admite de forma nativa esta funcionalidad?).


Es posible crear un UserType personalizado (por ejemplo, este ) y usarlo 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>

EDITAR: Hibernate viene con su propio EnumType (desde 3.2 en anotaciones de hibernación, desde 3.6 en núcleo de hibernación, no sabía que estaba en anotaciones de hibernación en el momento de escribir, pero vea la respuesta de Diego ).


Hibernate proporciona org.hibernate.type.EnumType para asignar tipos org.hibernate.type.EnumType . Por ejemplo,

package com.igalia.enumerates; public enum Status { BUSY, AVAILABLE; } package com.igalia.entities; class MyClass { private Status status; }

Luego, haz tu mapeo de Hibernate de la siguiente manera:

<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. Si prefiere usar anotaciones JPA en lugar de hbm.xml, use @Enumerated (EnumType.STRING). Compruébalo aquí:

Enumeraciones en hibernate