使用Hibernate很長時間了,如今把一些內容本身小結一下。 java
這裏介紹Hibernate使用UserType,UserType就是用戶自定義類型,這裏的類型指的是除了Hibernate定義的那些類型以外的用戶本身定義的。 sql
通常狀況下,Hibernate定義的類型是徹底足夠咱們使用的。(就我本身而言,儘可能不要本身去定義UserType) 數據庫
User類中經過@TypeDef能夠指定UserType,經過@TypeDefs能夠定義多個@TypeDef。 sass
經過@Type指定對User.emaillist是自定義類型emalilist session
在具體實現上將本來已List方式存放的email地址,按照以";"爲分隔存儲到了數據庫中。 app
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接口。 ide
如下是Email.class的實現。 ui
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》 this