<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 63  文章 - 0  trackbacks - 0
    <2009年5月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    UserType and CompositeUserType為Hibernate中提供的用戶類型自定義接口。根據這個接口,可以實現自定義的數據類型。 

    最近看<<深入淺出Hibernate>>,作者在書中介紹了Hibernate 提供的用戶自定義數據類型,于是效仿書中的方法,在數據庫表中添加一個字段用于記錄所有好友的userid,每個userid之間用";"加以分隔,同時將該字段映射為一個特殊的List集合,利用UserType interface實現String解析后將各個userid封裝在List中,將List中的記錄封裝成以";"分隔的String。
    使用UserType接口,實現了較好的設計風格,以及更好的重用性。
    /*
    * 用戶自定義的數據類型,對應數據庫中的一個字段,在該字段中,保存了
    * 多個用戶需要的信息,之間用";"加以分隔.
    * @Author:Paul
    * @Date:April 18th,2008
    */
    package com.globalhands.hibernate.userTypes;

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

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

    public class SpecialList implements UserType {
    private List specialList;

    private static final char SPLITTER = ';';

    private static final int[] TYPES = new int[] { Types.VARCHAR };

    public String assemble(Serializable arg0, Object arg1)
    throws HibernateException {
    return null;
    }

    /*
    * 將List封裝為一個String對象
    */
    public String assemble(List specialList) throws HibernateException {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < specialList.size() - 1; i++) {
    sb.append(specialList.get(i)).append(this.SPLITTER);
    }
    sb.append(specialList.get(specialList.size() - 1));
    return sb.toString();
    }

    /*
    * 創建一個新的List實例,包含原有的List實例中的所有元素.
    */
    public Object deepCopy(Object value) throws HibernateException {
    List sourceList = (List) value;
    List targetList = new ArrayList();
    targetList.addAll(sourceList);
    return targetList;
    }

    public Serializable disassemble(Object arg0) throws HibernateException {
    return null;
    }

    /*
    * 判斷specialList是否發生變化
    */
    public boolean equals(Object x, Object y) throws HibernateException {
    if (x == y) {
    return true;
    }
    if (x != null && y != null) {
    List xList = (List) x;
    List yList = (List) y;

    if (xList.size() != yList.size()) {
    return false;
    }

    for (int i = 0; i <= xList.size() - 1; i++) {
    String str1 = (String) xList.get(i);
    String str2 = (String) yList.get(i);
    if (!xList.equals(yList)) {
    return false;
    }
    }
    return true;
    }
    return false;
    }

    public int hashCode(Object arg0) throws HibernateException {
    return 0;
    }

    public boolean isMutable() {
    return false;
    }

    /*
    * 從resultset中取出email字段,并將其解析為List類型后返回
    */
    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;
    }
    }

    /*
    * 將以";"分隔的字符串解析為一個字符串數組
    */
    private List parse(String value) {
    String[] strs = value.split(";");
    List specialList = new ArrayList();
    for (int i = 0; i <= strs.length - 1; i++) {
    specialList.add(strs[i]);
    }
    return specialList;
    }

    /*
    * 將List型的email信息組裝成字符串之后保存到email字段
    */
    public void nullSafeSet(PreparedStatement st, Object value, int index)
    throws HibernateException, SQLException {
    if (value != null) {
    String str = assemble((List) value);
    Hibernate.STRING.nullSafeSet(st, str, index);
    } else {
    Hibernate.STRING.nullSafeSet(st, value, index);
    }
    }

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

    public Class returnedClass() {
    return List.class;
    }

    public int[] sqlTypes() {
    return TYPES;
    }

    }
    同時,修改相應的[ormapping_filename].hbm.xml中相應字段的映射信息
    <property name="buddy" type="com.globalhands.hibernate.userTypes.SpecialList">
                <column name="buddy" length="2000" not-null="true" />
            </property>
    之后,修改POJO類中該字段的返回類型為List。
    使用JUnit測試程序。
    posted on 2009-05-24 19:57 lanxin1020 閱讀(590) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 亚洲春色在线视频| 久久成人a毛片免费观看网站| 亚洲视频免费在线观看| 精品国产亚洲男女在线线电影 | 久久久久久久99精品免费| 在线观看亚洲精品专区| 亚洲精品第一综合99久久| 亚洲综合在线成人一区| 亚洲AV无码乱码在线观看富二代| 国产在线a不卡免费视频| 无码人妻久久一区二区三区免费丨| 无码日韩精品一区二区三区免费| 一区在线免费观看| 美女羞羞免费视频网站| 亚洲精品无码人妻无码| 亚洲av无码国产综合专区| 久久久久亚洲AV无码专区体验| 亚洲综合网站色欲色欲| 亚洲人成网站18禁止一区| 四虎影在线永久免费观看| 韩国二级毛片免费播放| 成人a视频片在线观看免费| 欧洲黑大粗无码免费| 久草免费在线观看视频| 无码国产精品一区二区免费vr| 18禁在线无遮挡免费观看网站| 久久国产精品免费| 国产精品成人啪精品视频免费| 又黄又大的激情视频在线观看免费视频社区在线 | 亚洲中久无码不卡永久在线观看| 国产精品久久香蕉免费播放| 午夜一级免费视频| 成年人免费观看视频网站| 毛片基地免费观看| 四虎影视大全免费入口| 黄a大片av永久免费| 国产成人精品免费视频大全五级 | 亚洲乱码在线视频| 亚洲资源最新版在线观看| 亚洲午夜精品久久久久久app | 亚洲国产精品狼友中文久久久|