<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 @ 2009-05-24 19:57 lanxin1020 閱讀(592) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲91av视频| 亚洲成A人片在线观看无码不卡| 水蜜桃视频在线观看免费| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 亚洲av永久中文无码精品| 免费av欧美国产在钱| 亚洲av片不卡无码久久| 日本亚洲免费无线码| 亚洲av无码国产综合专区| 青青草a免费线观a| 久久久久久亚洲av无码蜜芽| 一级毛片**免费看试看20分钟| 国产大片91精品免费看3| 羞羞视频在线免费观看| 一区国严二区亚洲三区| 一区二区三区视频免费观看| 亚洲精品无码专区在线在线播放| 99视频在线免费观看| 97se亚洲综合在线| 你好老叔电影观看免费| 亚洲AV无码精品无码麻豆| 91福利视频免费| 亚洲综合无码无在线观看| 免费一级毛片在线播放不收费| 亚美影视免费在线观看| 亚洲天堂中文资源| 黄瓜视频高清在线看免费下载| 婷婷亚洲综合五月天小说在线| 亚洲综合伊人久久综合| 日韩精品无码一区二区三区免费 | 久久久久久久亚洲精品| 日韩精品无码免费一区二区三区| 亚洲三级视频在线观看| 四虎永久在线精品视频免费观看| 97在线免费视频| 亚洲人成无码网站在线观看 | 亚洲毛片网址在线观看中文字幕| 久久99免费视频| 亚洲精品欧美综合四区| 亚洲va无码va在线va天堂| 毛片a级毛片免费观看免下载|