posts - 241,  comments - 116,  trackbacks - 0
          Hibernate的強大用過的童鞋肯定會知道的,通過OR映射我們可以很方便的實現數據庫操作,Hibernate對我們一些類型的映射都提供了 很好的支持,但是顯然也有不給力的地方,比如簡單的注冊,一個人可能有好多郵箱,對于這個問題怎么做呢?有人說簡單,可以另外開一張表,恩,很不錯,確實 可以,可是這樣有時候可能小題大作了。也有人說,直接將郵箱拼接成字符串然后在存儲,這個想法也很好,但在我們讀出來的時候就要再進行一次解析操作,將 EMAIL還原,這些都要求我們編程人員自己完成。那么Hibernate有沒有提供什么好的支持呢?回答是肯定的,Hibernate給我們提供了一個 UserType接口,通過UserType我們可以對一些常見的類型進行封轉,轉變成具有個性的類型。下面我們就來體驗一下吧: 債務追討

              首先我么創建一個自定義類型的類,讓他實現UserType接口:

          /**
           * @author :LYL
           *@date:2011-4-26,下午08:39:42
           */
          package com.lyl.hibernate.mytype;

          import java.io.Serializable;
          import java.sql.PreparedStatement;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Types;
          import java.util.ArrayList;
          import java.util.List;

          import org.hibernate.Hibernate;
          import org.hibernate.HibernateException;
          import org.hibernate.usertype.UserType;

          import com.opensymphony.oscache.util.StringUtil;

          public class ArrayType implements UserType{

              private static final char Spliter=';';

              /**
               * 自定義類型的完全復制方法,構造返回對象
               *    1. 當nullSafeGet方法調用之后,我們獲得了自定義數據對象,在向用戶返回自定義數據之前
               * deepCopy方法被調用,它將根據自定義數據對象構造一個完全拷貝,把拷貝返還給客戶使用。
               *    2.此時我們就得到了自定義數據對象的兩個版本
               *     原始版本由hibernate維護,用作臟數據檢查依據,復制版本由用戶使用,hibernate將在
               * 臟數據檢查過程中比較這兩個版本的數據。人人
               *
               *
               */
              @Override
              public Object deepCopy(Object value) throws HibernateException {
                  List source=(List)value;
                  List target=new ArrayList();
                  target.addAll(source);
                  return target;
              }

              /**
               * 自定義數據類型比對方法
               * 用作臟數據檢查,X,Y為兩個副本
               */
              @Override
              public boolean equals(Object x, Object y) throws HibernateException {
                  if (x==y) {
                      return true;
                  }
                  if(x!=null&&y!=null){
                      List xList=(List)x;
                      List ylList=(List)y;
                      if (xList.size()!=ylList.size()) {
                          return false;
                      }
                      for(int i=0;i<xList.size();i++){
                          String s1=(String)xList.get(i);
                          String s2=(String)ylList.get(i);
                          if (!s1.equals(s2)) {
                              return false;
                          }
                      }
                      return true;
                  }
                  return false;
              }

              /**
               * 返回給定類型的hashCode
               */
              @Override
              public int hashCode(Object value) throws HibernateException {
                  return value.hashCode();
              }

              /**
               * 表示本類型實例是否可變
               */
              @Override
              public boolean isMutable() {
                  // TODO Auto-generated method stub
                  return false;
              }

              /**
               * 讀取數據轉換為自定義類型返回
               * names包含了自定義類型的映射字段名稱
               */
              @SuppressWarnings("deprecation")
              @Override
              public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
              throws HibernateException, SQLException {
                  //取得字段名稱并查詢
                  String value=(String)Hibernate.STRING.nullSafeGet(rs, names[0]);
                  if (value!=null) {
                      return parse(value);
                  }else {
                      return null;
                  }

              }

              /**
               * 數據保存時被調用
               */
              @Override
              public void nullSafeSet(PreparedStatement ps, Object value, int index)
              throws HibernateException, SQLException {
                  if(value!=null){
                      String str=combain((List)value);
                      //保存數據
                      Hibernate.STRING.nullSafeSet(ps, str,index);
                  }else {
                      //空值就直接保存了
                      Hibernate.STRING.nullSafeSet(ps,value.toString(),index);
                  }
              }

              /**
               * 將數據解析為LIST返回
               * @param value
               * @return
               */
              private List parse(String value){
                  List list=StringUtil.split(value, Spliter);
                  return list;
              }

              private String combain(List list){
                  StringBuffer sb=new StringBuffer();
                  for(int i=0;i<list.size()-1;i++){
                      sb.append(list.get(i)).append(Spliter);
                  }
                  sb.append(list.get(list.size()-1));
                  return sb.toString();
              }

              /**
               * 修改類型對應的java類型
               * 我們這邊使用LIST類型
               */
              @Override
              public Class returnedClass() {
                  return List.class;
              }

              /**
               * 修改類型對應的SQL類型
               * 使用VARCHAR
               */
              @Override
              public int[] sqlTypes() {
                  return new int[]{Types.VARCHAR};
              }

              @Override
              public Object replace(Object arg0, Object arg1, Object arg2)
              throws HibernateException {
                  return null;
              }

              /**
               * 不知干嘛用的
               */
              @Override
              public Object assemble(Serializable arg0, Object arg1)
              throws HibernateException {
                  return null;
              }
              @Override
              public Serializable disassemble(Object arg0) throws HibernateException {
                  return null;
              }
          }

          然后我們在配置OR映射文件時,指定一下自己的類型:

          <property name="emails" column="emails" type="com.lyl.hibernate.mytype.ArrayType"/>

          posted on 2011-04-28 09:25 墻頭草 閱讀(3292) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 博野县| 湟中县| 曲周县| 浮梁县| 玉溪市| 卢龙县| 福建省| 洱源县| 柞水县| 成武县| 龙南县| 卢氏县| 遂平县| 卓尼县| 托克逊县| 浮梁县| 彭泽县| 阿巴嘎旗| 辽宁省| 上虞市| 阿拉善盟| 玉门市| 永城市| 阜新| 县级市| 习水县| 青浦区| 乌苏市| 茂名市| 旅游| 鹰潭市| 县级市| 宁河县| 博爱县| 米泉市| 正宁县| 吴忠市| 汉阴县| 崇文区| 库尔勒市| 宁蒗|