使用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; }}
中的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
以上代码参考与摘录了 夏昕《深入浅出Hibernate》