将Enum枚举类型持久化到数据库,必须写一个EnumUsertype,Enum的类和继承EnumUsertype的类,在此谨贴上代码。相信有这个需求的人不多。
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 < E > 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 );
}
}
/**
* @author xiaoxin
* @create time:9:51:05 AM,Feb 20, 2009
*/
public enum PermissionEnum {
RED,GREEN;
}
public class PermissionEnumUserType extends EnumUserType<PermissionEnum> {
/**
* @param c
*/
public PermissionEnumUserType() {
super(PermissionEnum.class);
// TODO Auto-generated constructor stub
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.ipanel.Tbuser" table="Tbuser">
<id name="id" type="string">
<generator class="uuid"></generator>
</id>
<set name="grantedPermissions" table="GrantedPermissions"
lazy="false" cascade="all">
<key column="user_id"></key>
<element
type="PermissionEnumUserType"
column="grantedPermission" not-null="true">
</element>
</set>
</class>
</hibernate-mapping>