博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate UserType 使用xdoclet映射数据库问题
阅读量:2454 次
发布时间:2019-05-10

本文共 10201 字,大约阅读时间需要 34 分钟。

 

在该文最下面的有一小段文字,其中写道:

With UserType s, also specify the sql-type. In xdoclet , we map user types this way

@hibernate.property type = "com.pfn.wirepower.srv.persistence.userTypes.OurCustomUserType" @hibernate.column name = "CustomObjectCol" sql-type="VARCHAR(50)"

 

 

/** 缩略图列表,按fileName1.xxx;fileName2.xxx;fileName3.xxx;... */	private Map
fileNames; /** * @hibernate.property type="com.sunsci.material.ext.hibernate.MapType" * @hibernate.column name="fileNames" sql-type="text" * @return */ public Map
getFileNames() { return fileNames; } public void setFileNames(Map
fileNames) { this.fileNames = fileNames; }

 

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.Iterator;import java.util.List;import org.apache.commons.lang.StringUtils;import org.hibernate.Hibernate;import org.hibernate.HibernateException;import org.hibernate.usertype.UserType;public class ListType implements UserType {	private static final String SPLITTER = ";";	private static final int[] TYPES = new int[] { Types.VARCHAR };		public Object assemble(Serializable serializable, Object object)			throws HibernateException {		return deepCopy(serializable);	}		public Object deepCopy(Object object) throws HibernateException {		List sourceSet = (List) object;		List targetSet = new ArrayList();		if (sourceSet != null) {			targetSet.addAll(sourceSet);		}		return targetSet;	}		public Serializable disassemble(Object object) throws HibernateException {		return (Serializable) deepCopy(object);	}		public boolean equals(Object one, Object other) throws HibernateException {		if (one == other) {// 如果两个对象的指针是指向同一位置。			return true;		}		if (one != null && other != null) {			List set0 = (List) one;			List set1 = (List) other;			if (set0.size() != set1.size()) {// 如果列表的长度不相等				return false;			}			Object[] s0 = set0.toArray();			Object[] s1 = set1.toArray();			if (s0.length != s1.length) {// 如果列表的长度不相等				return false;			}			for (int i = 0; i < s0.length; i++) {				Object id0 = s0[i];				Object id1 = s1[i];				if (!id0.equals(id1)) {// 如果在列表中相同位置上的对象不相等					return false;				}			}			return true;		}		return false;	}		public int hashCode(Object object) throws HibernateException {		List s = (List) object;		return s.hashCode();	}		public boolean isMutable() {		return false;	}		public Object nullSafeGet(ResultSet resultSet, String[] stringArray,			Object object) throws HibernateException, SQLException {		String value = (String) Hibernate.STRING.nullSafeGet(resultSet,				stringArray[0]);		if (value != null) {			return parse(value);		} else {			return new ArrayList();		}	}	private List parse(String value) {		String[] strs = StringUtils.split(value, SPLITTER);		List set = new ArrayList();		for (int i = 0; i < strs.length; i++) {			if (StringUtils.isNotBlank(strs[i])) {				set.add(strs[i]);				// set.add(new Long(Long.parseLong(strs[i])));			}		}		return set;	}		public void nullSafeSet(PreparedStatement preparedStatement, Object object,			int _int) throws HibernateException, SQLException {		if (object != null) {			String str = assemble((List) object);			Hibernate.STRING.nullSafeSet(preparedStatement, str, _int);		} else {			Hibernate.STRING.nullSafeSet(preparedStatement, "", _int);		}	}	private String assemble(List set) {		StringBuffer sb = new StringBuffer();		Iterator it = set.iterator();		while (it.hasNext()) {			sb.append(it.next());			sb.append(SPLITTER);		}		String fs = sb.toString();		if (fs != null && fs.length() > 0 && fs.endsWith(SPLITTER)) {			fs = fs.substring(0, fs.length() - 1);		}		return fs;	}		public Object replace(Object object, Object object1, Object object2)			throws HibernateException {		return object;	}		public Class returnedClass() {		return List.class;	}		public int[] sqlTypes() {		return TYPES;	}}

 

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.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.commons.collections.map.LinkedMap;import org.hibernate.Hibernate;import org.hibernate.HibernateException;import org.hibernate.usertype.UserType;/** * @author linzq *  */public class MapType implements UserType, Serializable {    private static final long serialVersionUID = -8041009346154850427L;    public MapType() {        super();    }    public MapType(Map attributeMap) {        super();        this.attributeMap = attributeMap;    }    private Map attributeMap;    public static final String SPLITTER = ";";    public static final String SEPARATOR = ":";    public static final String VALUE_BREAK = ",";    public static final char BRACKET_LEFT = '{';    public static final char BRACKET_RIGHT = '}';    public static final int[] SQLTYPES = new int[] { Types.VARCHAR};    public boolean isMutable() {        return false;    }    public int[] sqlTypes() {        return SQLTYPES;    }    public Object assemble(Serializable id, Object obj) throws HibernateException {        return null;    }    /**     * 将Map类型的属性拼接成字符串     *      * @param attributeList     * @return     * @throws HibernateException     */    public Object assemble(Map attributeMap) throws HibernateException {        if (attributeMap == null) {            return null;        }        StringBuffer asbl = new StringBuffer();        Iterator itr = attributeMap.keySet().iterator();        String _key = null;        while (itr.hasNext()) {            _key = (String) itr.next();            asbl.append(SPLITTER).append(BRACKET_LEFT).append(_key).append(SEPARATOR).append(attributeMap.get(_key)).append(BRACKET_RIGHT);        }        return asbl.toString().replaceFirst(SPLITTER, "");    }    /**     * 自定义类型的完全复制方法,返回一个和原自定义数据相同的新对象     *      * @param value     *            the object to be cloned, which may be null     * @return Object a copy     * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object)     */    public Object deepCopy(Object value) throws HibernateException {        if (value == null) {            return null;        }        Map sourceMap = (Map) value;        Map targetMap = new HashMap();        targetMap.putAll(sourceMap);        return targetMap;    }    /**     * 自定义数据类型的比较方法     *      * @param x     * @param y     * @return boolean     * @see org.hibernate.usertype.UserType#equals(java.lang.Object,     *      java.lang.Object)     */    public boolean equals(Object x, Object y) throws HibernateException {        if (x == y) {            return true;        }        if (x != null && y != null) {            Map xMap = (Map) x;            Map yMap = (Map) y;            if (xMap.size() != yMap.size()) {                return false;            }            List
_xList = new ArrayList(xMap.keySet()); List
_yList = new ArrayList(xMap.keySet()); Collections.sort(_xList); Collections.sort(_yList); for (int i = 0; i < xMap.size(); i++) { if (!_xList.get(i).equals(_yList.get(i))) { return false; } if (!xMap.get(_xList.get(i)).equals(yMap.get(_yList.get(i)))) { return false; } } return true; } return false; } public int hashCode(Object arg0) throws HibernateException { return attributeMap.hashCode(); } /** * 将以格式为{key:value};{key:value1,value2}的字符串数组解析成一个Map * * @param value * @return */ public Map parse(String value) { if (value == null) { return null; } String[] strs = org.apache.commons.lang.StringUtils.split(value.trim(), SPLITTER); Map attributeMap = new LinkedMap(); String _temp = null; for (int i = 0; i < strs.length; i++) { _temp = strs[i].substring(1, strs[i].length() - 1); attributeMap.put(_temp.split(SEPARATOR, 2)[0], _temp.split(SEPARATOR, 2)[1]); } return attributeMap; } /** * 从JDBC的ResultSet中读取数据,并将其转换为自定义类型后返回。 此方法要求对可能出现null的情况做处理。 * names中包含了当前自定义类型的映射字段名称。 * * @param rs * a JDBC result set * @param names * the column names * @param owner * the containing entity * @return Object * @throws HibernateException * @throws SQLException * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, * java.lang.String[], java.lang.Object) */ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { String value = (String) Hibernate.STRING.nullSafeGet(rs, names[0]); if (value != null) { attributeMap = parse(value); return attributeMap; } return null; } /** * 在Hibernate进行数据保存时被调用 可以通过PreparedStatement将自定义数据写入对应的数据库字段中 * names中包含了当前自定义类型的映射字段名称。 * * @param st * a JDBC prepared statement * @param value * the object to write * @param index * statement parameter index * @throws HibernateException * @throws SQLException * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, * java.lang.String[], java.lang.Object) */ public void nullSafeSet(PreparedStatement pst, Object value, int index) throws HibernateException, SQLException { if (value != null) { Hibernate.STRING.nullSafeSet(pst, assemble((Map) value), index); } else { Hibernate.STRING.nullSafeSet(pst, value, index); } } public Class returnedClass() { return MapType.class; } public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException { return null; } public Serializable disassemble(Object arg0) throws HibernateException { return null; } public Map getAttributeMap() { return attributeMap; } public void setAttributeMap(Map attributeMap) { this.attributeMap = attributeMap; }}
 

 

 

转载地址:http://jgbhb.baihongyu.com/

你可能感兴趣的文章
hadoop单机映射_如何在命令行中设置Hadoop的映射器和缩减器的数量?
查看>>
刘昕 hkust_在Linux上配置HKUST的sMobileNet
查看>>
Python“ for”循环(定迭代)
查看>>
软件测试应届生没有项目经历_为什么有些软件项目网站糟透了,而另一些却没有
查看>>
python入门测试教程_Python测试入门
查看>>
python概率编程_Python中的概率编程
查看>>
Python中的运算符和表达式
查看>>
读写csv文件python_用Python读写CSV文件
查看>>
python super_使用Python super()增强您的课程
查看>>
愚人节导入_愚人节Python恶作剧
查看>>
正则表达式科学计数法_数据科学家的正则表达式
查看>>
sql基础_SQL基础
查看>>
一个工作表可以有两个事件吗_你有两个工作
查看>>
Raul的新机器学习书!
查看>>
python制作可视化图表_可视化数据–用python覆盖图表
查看>>
双耳节拍 枕头_枕头3-0-0不在
查看>>
命题逻辑真值表_命题逻辑
查看>>
openbsd_OpenBSD对psutil的支持
查看>>
emacs python_Emacs –最好的python编辑器?
查看>>
熊猫作弊表(通过yhat)
查看>>