使用Hibernate很长时间了,现在把一些内容自己小结一下。
这里介绍Hibernate使用UserType,UserType就是用户自定义类型,这里的类型指的是除了Hibernate定义的那些类型之外的用户自己定义的。
一般情况下,Hibernate定义的类型是完全足够我们使用的。(就我自己而言,尽量不要自己去定义UserType)
User类中通过@TypeDef可以指定UserType,通过@TypeDefs可以定义多个@TypeDef。
通过@Type指定对User.emaillist是自定义类型emalilist
在具体实现上将原本已List方式存放的email地址,按照以";"为分隔存储到了数据库中。
import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
@TypeDefs(
{
@TypeDef(
name = "emailList",
defaultForType = List.class,
typeClass = Email.class
)
}
)
@Entity
@Table(name = "user_info")
public class User implements Serializable {
private String id;
private String userName;
@Type(type = "emailList")
private List emaillist;
public List getEmaillist() {
return emaillist;
}
public void setEmaillist(List emaillist) {
this.emaillist = emaillist;
}
}
@TypeDef 中的typeClass=Email.class,Email类需要实现UserType接口。
以下是Email.class的实现。
public class Email implements UserType {
@Override
public Object assemble(Serializable arg0, Object arg1)
throws HibernateException {
// TODO Auto-generated method stub
return null;
}
@Override
public Object deepCopy(Object arg0) throws HibernateException {
if(arg0!=null){
List source =(List)arg0;
List target =new ArrayList();
target.addAll(source);
return target;
}
else{
return arg0;
}
}
@Override
public Serializable disassemble(Object arg0) throws HibernateException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean equals(Object arg0, Object arg1) throws HibernateException {
if(arg0==null && arg1==null){
return true;
}
else if(arg0!=null && arg1!=null){
List a =(List)arg0;
List b=(List)arg1;
if(a.size()!=b.size()) return false;
for(int i=0;i<a.size();i++){
if(a.get(i).equals(b.get(i))==false) return false;
}
return true;
}
else{
return false;
}
}
@Override
public int hashCode(Object arg0) throws HibernateException {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isMutable() {
// TODO Auto-generated method stub
return false;
}
/**
* 方法从ResultSet中,获取数据集,并转换成自定义格式。
*/
@Override
public Object nullSafeGet(ResultSet rs, String[] name,
SessionImplementor session, Object arg3) throws HibernateException,
SQLException {
for(String one : name){
System.out.println("name="+one);
}
String str= (String) StringType.INSTANCE.get(rs, name[0], session);
List emailList=null;
if(str!=null){
emailList=new ArrayList();
for(String one:str.split(";")){
emailList.add(one);
}
}
return emailList;
}
/**
* 将对象属性放入到字段中
*/
@Override
public void nullSafeSet(PreparedStatement st, Object arg1, int index,
SessionImplementor session) throws HibernateException, SQLException {
if(arg1!=null){
List emailList=(List)arg1;
StringBuilder sb=new StringBuilder();
for(int i=0;i<emailList.size()-1;i++){
sb.append(emailList.get(i)).append(";");
}
sb.append(emailList.get(emailList.size()-1));
StringType.INSTANCE.nullSafeSet(st, sb.toString(), index, session);
}
else{
StringType.INSTANCE.nullSafeSet(st, arg1, index, session);
}
}
@Override
public Object replace(Object arg0, Object arg1, Object arg2)
throws HibernateException {
// TODO Auto-generated method stub
return null;
}
/**
* 对应的对象属性的类型
*/
@Override
public Class returnedClass() {
// TODO Auto-generated method stub
return List.class;
}
/**
* 对应的sql类型,也就是实际的对象属性对应的SQL类型。
*/
@Override
public int[] sqlTypes() {
return new int[]{Types.VARCHAR};
}
}
以上代码参考与摘录了 夏昕《深入浅出Hibernate》