sábado, 20 de marzo de 2010

Mapeos de Enums en Hibernate

Esta información fue provista por un amigo mío y del blog, Lucas Acosta

Cuando usamos Enum y tenemos que guardar con hibérnate podemos hacer lo que sugiere la documentación de hibérnate:

http://community.jboss.org/wiki/UserTypeforpersistinganEnumwithaVARCHARcolumn

Podemos guardar nuestro Enum en una columna como varchar:

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);

}

}


Supongamos que tenemos este Enum:

public enum MyEnum {

ENUM_A, ENUM_B;

}

Hacemos el userType :

public class MyEnumUserType extends EnumUserType<MyEnum> {

  public MyEnumUserType() {
super(MyEnum.class);
}



}


Y Por ultimo mapeamos:

<property name="sample" type="mypackage.MyEnumUserType" not-null="true"/>