Hibernate如何映射enum(JDK5.0中的枚舉類)方法一
先看一張表:
Create table test(
Test_id integer not null auto_increment,
gender Enum(MALE, FEMALE)
)
在hibernate的pojo中可以這樣描述:
public final class TestVO {
private Integer id;
public staticenum Gender {
MALE, FEMALE;
}
private Gender gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
}
而后要自己寫一個適合enum的在hibernate中的類型,雖然hibernate已經(jīng)有了
Org.hibernate.type.EnumType.但是這個類是用于annotation的(在后面會討論怎么用annotation技術(shù)映射enum).
創(chuàng)建一個自己的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;
import org.apache.log4j.*;
public class EnumUserType<E extendsEnum<E>> implements UserType {
private Logger log = Logger.getLogger(EnumUserType.class);
private Class<E> clazz = null;
private static final int[] SQL_TYPES = { Types.VARCHAR };
protected EnumUserType(Class<E> c) {
this.clazz = c;
}
public int[] sqlTypes() {
return SQL_TYPES;
}
public Class<E> returnedClass() {
return clazz;
}
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
// TODO Auto-generated method stub
return cached;
}
public Object deepCopy(Object value) throws HibernateException {
// TODO Auto-generated method stub
return value;
}
public Serializable disassemble(Object value) throws HibernateException{
// TODO Auto-generated method stub
return (Serializable) value;
}
public boolean equals(Object x, Object y) throws HibernateException {
// TODO Auto-generated method stub
if (x == y)
return true;
if (null == x || null == y)
return true;
return x.equals(y);
}
public int hashCode(Object x) throws HibernateException {
// TODO Auto-generated method stub
return x.hashCode();
}
public boolean isMutable() {
// TODO Auto-generated method stub
return false;
}
public Object nullSafeGet(ResultSet resultSet, String[] names, Objectowner)
throws HibernateException, SQLException {
// TODO Auto-generated method stub
E result = null;
if (!resultSet.wasNull()) {
String name = resultSet.getString(names[0]).toUpperCase();
result = Enum.valueOf(clazz, name);
}
return result;
}
public void nullSafeSet(PreparedStatement prepareStatement, Objectvalue,
int index) throws HibernateException, SQLException {
// TODO Auto-generated method stub
if (null == value) {
prepareStatement.setNull(index, Types.VARCHAR);
} else {
prepareStatement.setString(index, ((Enum) value).name());
}
}
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
// TODO Auto-generated method stub
return original;
}
}
在這里筆者嚴(yán)重提醒大家:
如果你的枚舉類里定義的是大寫字母,比如:
public static enum Gender {
MALE, FEMALE;
}
那么在String name= resultSet.getString(names[0]).toUpperCase();
這里一定要加上toUpperCase()方法。筆者這里介紹的方法,只適用于enmu里的類型為String類型,若要映射其他類新,可以自己修改。
最后創(chuàng)建一個子類,繼承于這個類:
public class GenderEnumType extendsEnumUserType<Gender> {
public GenderEnumType() {
super(Gender.class);
// TODO Auto-generated constructor stub
}
}
這樣,GenderEnumType就是你在hibernate中定義的可以映射enum的類。
當(dāng)然要寫入**.hbm.xml了:
<?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 package="">
<class name="TestVO" table="test">
<id name="id" column="test_id">
<generator class="native" />
</id>
<property name="gender" not-null="true"column="gender"
type="GenderEnumType" />
</class>
</hibernate-mapping>
(注釋:包的命名可以自己去改,這里不在解釋)。