Estou com problema em usar Enum, com hibernate. Seguindo site http://community.jboss.org/wiki/Java5StringValuedEnumUserType
Criei minha interface:
[code]public interface StringValuedEnum {
/**
* Current string value stored in the enum.
* @return string value.
*/
public String getValue();
}[/code]
A classe Reflect:
[code]public class StringValuedEnumReflect {
/**
* Don't let anyone instantiate this class.
* @throws UnsupportedOperationException Always.
*/
private StringValuedEnumReflect() {
throw new UnsupportedOperationException("This class must not be instanciated.");
}
/**
* All Enum constants (instances) declared in the specified class.
* @param enumClass Class to reflect
* @return Array of all declared EnumConstants (instances).
*/
private static <T extends Enum<T>> T[]
getValues(Class<T> enumClass){
return enumClass.getEnumConstants();
}
/**
* All possible string values of the string valued enum.
* @param enumClass Class to reflect.
* @return Available string values.
*/
public static <T extends Enum<T> & StringValuedEnum> String[]
getStringValues(Class<T> enumClass){
T[] values = getValues(enumClass);
String[] result = new String[values.length];
for (int i=0; i<values.length; i++){
result[i] = values[i].getValue();
}
return result;
}
/**
* Name of the enum instance which hold the especified string value.
* If value has duplicate enum instances than returns the first occurency.
* @param enumClass Class to inspect.
* @param value String.
* @return name of the enum instance.
*/
public static <T extends Enum<T> & StringValuedEnum> String
getNameFromValue(Class<T> enumClass, String value){
T[] values = getValues(enumClass);
for (T v : values){
if (v.getValue().equals(value)){
return v.name();
}
}
return "";
}
}[/code]
A Classe EnumType:
[code]public class StringValuedEnumType <T extends Enum & StringValuedEnum>
implements EnhancedUserType, ParameterizedType{
/**
* Enum class for this particular user type.
*/
private Class<T> enumClass;
/**
* Value to use if null.
*/
private String defaultValue;
/** Creates a new instance of ActiveStateEnumType */
public StringValuedEnumType() {
}
public void setParameterValues(Properties parameters) {
String enumClassName = parameters.getProperty("enum");
try {
enumClass = (Class<T>) Class.forName(enumClassName).asSubclass(Enum.class).
asSubclass(StringValuedEnum.class); //Validates the class but does not eliminate the cast
} catch (ClassNotFoundException cnfe) {
throw new HibernateException("Enum class not found", cnfe);
}
setDefaultValue(parameters.getProperty("defaultValue"));
}
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
/**
* The class returned by <tt>nullSafeGet()</tt>.
* @return Class
*/
public Class returnedClass() {
return enumClass;
}
public int[] sqlTypes() {
return new int[] { Types.VARCHAR };
}
public boolean isMutable() {
return false;
}
/**
* Retrieve an instance of the mapped class from a JDBC resultset. Implementors
* should handle possibility of null values.
*
* @param rs a JDBC result set
* @param names the column names
* @param owner the containing entity
* @return Object
* @throws HibernateException
* @throws SQLException
*/
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException {
String value = rs.getString( names[0] );
if (value==null) {
value = getDefaultValue();
if (value==null){ //no default value
return null;
}
}
String name = getNameFromValue(enumClass, value);
Object res = rs.wasNull() ? null : Enum.valueOf(enumClass, name);
return res;
}
/**
* Write an instance of the mapped class to a prepared statement. Implementors
* should handle possibility of null values. A multi-column type should be written
* to parameters starting from <tt>index</tt>.
*
* @param st a JDBC prepared statement
* @param value the object to write
* @param index statement parameter index
* @throws HibernateException
* @throws SQLException
*/
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
if (value==null) {
st.setNull(index, Types.VARCHAR);
} else {
st.setString( index, ((T) value).getValue() );
}
}
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
return cached;
}
public Serializable disassemble(Object value) throws HibernateException {
return (Enum) value;
}
public Object deepCopy(Object value) throws HibernateException {
return value;
}
public boolean equals(Object x, Object y) throws HibernateException {
return x==y;
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return original;
}
public String objectToSQLString(Object value) {
return '\'' + ((T) value).getValue() + '\'';
}
public String toXMLString(Object value) {
return ((T) value).getValue();
}
public Object fromXMLString(String xmlValue) {
String name = getNameFromValue(enumClass, xmlValue);
return Enum.valueOf(enumClass, name);
}
}[/code]
E meu Enum:
[code]
public enum Status implements StringValuedEnum{
Ativo("A"),
Inativo("I");
private final String status;
ActiveState(final String status){
this.status = status;
}
public String getValue() {
return this.status;
}
}[/code]
Como que eu mapearia por anotação minha classe:
Seria Assim:
@Enumerated(EnumType.STRING)
@Column(name = "IDN_STATUS", columnDefinition = "char(1)")
private Status status;