property mapear enumerated enum attribute annotation hibernate enums hibernate-mapping varchar

mapear - Hibernate mapa enum a varchar



spring boot enum (4)

Agregue esto como un parámetro de EnumType:

<param name="type">12</param>

Esto se debe a que 12 es equivalente a java.sql.Types.VARCHAR

Supongamos que tengo esta enumeración:

public enum TestEnum { EXAMPLE, FURTHER_EXAMPLE, LAST_EXAMPLE }

Con este mapeo en el .hbm :

<property name="testEnum" column="TEST_COLUMN"> <type name="org.hibernate.type.EnumType"> <param name="enumClass">p.a.c.k.TestEnum</param> </type> </property>

La enumeración se envía a la base de datos como 0 , 1 , 2 . Me gustaría que los valores se almacenen en su lugar como EXAMPLE , FURTHER_EXAMPLE o LAST_EXAMPLE en una columna varchar.

¿Cómo puedo asignar enumeración a una columna varchar?


Puedes usar anotaciones como esta:

public class MyClass { TestEnum testEnum; @column(name="TEST_COLUMN") @Enumerated(EnumType.STRING) public TestEnum getTestEnum(){ this.testEnum; } }


Quizás esto sea más descriptivo.

<param name="useNamed">true</param>


Si desea almacenar cualquier valor de enum como varchar en la base de datos, siga los pasos a continuación.

  1. Hibernate proporciona una interfaz UserTpe. Necesitamos crear una clase que implemente la interfaz UserType.

    import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.hibernate.HibernateException; import org.hibernate.usertype.UserType; public class EnumUserType<E extends Enum<E>> implements UserType { private Class<E> clazz = null; protected EnumUserType(Class<E> c) { this.clazz = c; } private static final int[] SQL_TYPES = { Types.VARCHAR }; public int[] sqlTypes() { return SQL_TYPES; } public Class returnedClass() { return clazz; } public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException { String name = resultSet.getString(names[0]); E result = null; if (!resultSet.wasNull()) { result = Enum.valueOf(clazz, name); } return result; } public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException { if (null == value) { preparedStatement.setNull(index, Types.VARCHAR); } else { preparedStatement.setString(index, ((Enum) value).name()); } } public Object deepCopy(Object value) throws HibernateException { return value; } public boolean isMutable() { return false; } public Object assemble(Serializable cached,Object owner) throws HibernateException { return cached; } public Serializable disassemble(Object value) throws HibernateException { return (Serializable) value; } public Object replace(Object original, Object target, Object owner) throws HibernateException { return original; } public int hashCode(Object x) throws HibernateException { return x.hashCode(); } public boolean equals(Object x, Object y) throws HibernateException { if (x == y) return true; if (null == x || null == y) return false; return x.equals(y); } }

  2. Supongamos que tengo un EncryptionStatus Enum.

    import java.io.Serializable; import com.google.gwt.user.client.rpc.IsSerializable; public enum EncryptionStatus implements IsSerializable, Serializable { PLAIN, HASH, RE_HASH, SUPER_HASH, SUPER_REHASH, OPEN, ENCRYPT, RE_ENCRYPT }

  3. Necesitamos crear una clase que amplíe nuestro EnumUserType creado.

    public class EncryptionStatusType extends EnumUserType<EncryptionStatus>{ public EncryptionStatusType() { super(EncryptionStatus.class); } }

  4. Ahora necesitamos asignar la clase creada anteriormente en el archivo hbm.xml en lugar de la asignación Enum que almacena el valor enum como varchar en la base de datos. Por ejemplo,

<property name="secureStatus" type="com.nextenders.facadeimplementation.util.userenum.EncryptionStatusType" column="secure_status" />