`

Hibernate中UserType的使用

阅读更多

1、新建一个Email类型的字段

package cn.ehoo.hibernate;

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.apache.commons.lang.StringUtils;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

/**
 * @author hy-he
 * 
 */
public class EMailList implements UserType {
	private List emails;
	private static final String SPLITTER = ";";
	private static final int[] TYPES = new int[] { Types.VARCHAR };

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.sf.hibernate.UserType#sqlTypes()
	 */
	public int[] sqlTypes() {
		// TODO Auto-generated method stub
		return TYPES;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.sf.hibernate.UserType#returnedClass()
	 */
	public Class returnedClass() {
		// TODO Auto-generated method stub
		return List.class;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.sf.hibernate.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) {
			List xList = (List) x;
			List yList = (List) y;
			if (xList.size() != yList.size())
				return false;
			for (int i = 0; i < xList.size(); i++) {
				String str1 = (String) xList.get(i);
				String str2 = (String) yList.get(i);
				if (!str1.equals(str2))
					return false;
			}
			return true;
		}
		return false;
	}

	/**
	 * 从email 中取出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;
		}
	}

	/**
	 * 将List型的email信息组装成字符串之后保存在email字段
	 */
	public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
		System.out.println("Set method excecuted");
		if (value != null) {
			String str = assemble((List) value);
			Hibernate.STRING.nullSafeSet(st, str, index);
		} else {
			Hibernate.STRING.nullSafeSet(st, value, index);
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.sf.hibernate.UserType#deepCopy(java.lang.Object)
	 */
	public Object deepCopy(Object value) throws HibernateException {
		List sourcelist = (List) value;
		List targetlist = new ArrayList();
		targetlist.addAll(sourcelist);
		return targetlist;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.sf.hibernate.UserType#isMutable()
	 */
	public boolean isMutable() {
		// TODO Auto-generated method stub
		return false;
	}

	private String assemble(List emailList) {
		StringBuffer strBuf = new StringBuffer();
		for (int i = 0; i < emailList.size() - 1; i++) {
			strBuf.append(emailList.get(i)).append(SPLITTER);
		}
		strBuf.append(emailList.get(emailList.size() - 1));
		return strBuf.toString();
	}

	private List parse(String value) {

		String[] strs = StringUtils.split(value, SPLITTER);
		List emailList = new ArrayList();
		for (int i = 0; i < strs.length; i++) {
			emailList.add(strs[i]);
		}
		return emailList;
	}

	@Override
	public Object assemble(Serializable arg0, Object arg1) throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Serializable disassemble(Object arg0) throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int hashCode(Object arg0) throws HibernateException {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}
}

 

2、POJO类

 

package cn.ehoo.hibernate;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @author hy-he
 * @hibernate.class table = "USER_TYPE_USER"
 */
public class UserTypeUser implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id;
	private String name;
	private Integer age;
	private List email = new ArrayList();

	/**
	 * @hibernate.id column = "USER_ID" generator-class = "increment"
	 * @return
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @hibernate.property column = "AGE"
	 * @return
	 */
	public Integer getAge() {
		return age;
	}

	/**
	 * @hibernate.property column = "EMAIL" type =
	 *                     "hibernate.usertype.EMailList"
	 * @return
	 */
	public List getEmail() {
		return email;
	}

	/**
	 * @hibernate.property column = "NAME"
	 * @return
	 */
	public String getName() {
		return name;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public void setEmail(List email) {
		this.email = email;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

3、POJO类的映射

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="eg">
	<class name="cn.ehoo.hibernate.UserTypeUser" table="USER_TYPE_USER" dynamic-update="false" dynamic-insert="false">

		<id name="id" column="USER_ID" type="java.lang.Long">
			<generator class="increment"></generator>
		</id>

		<property name="age" type="java.lang.Integer" update="true" insert="true" access="property" column="AGE" />

		<property name="email" type="cn.ehoo.hibernate.EMailList" update="true" insert="true" access="property" column="EMAIL" />

		<property name="name" type="java.lang.String" update="true" insert="true" access="property" column="NAME" />

		<!--
			To add non XDoclet property mappings, create a file named
			hibernate-properties-UserTypeUser.xml
			containing the additional properties and place it in your merge dir.
		-->

	</class>



</hibernate-mapping>

 

4、测试的两个方法

 

	
	
	
	
	
	
	
	
	public static void insertUser() throws HibernateException {
		  UserTypeUser user = new UserTypeUser();
		  user.setAge(new Integer(23));
		  user.setName("Test UserType");
		  user.getEmail().add("rever@hotmail.com");
		  user.getEmail().add("rever1@hotmail.com");
		  user.getEmail().add("rever2@hotmail.com");
		  user.getEmail().add("rever3@hotmail.com");
		  Session session = HibernateUtil.getSession();
		  Transaction tx = session.beginTransaction();
		  session.save(user);

		  tx.commit();
		  HibernateUtil.closeSession();
		 }


		 public static void display() throws HibernateException {
		  Session session = HibernateUtil.getSession();
		  Query query = session.createQuery("from UserTypeUser");
		  List users =  query.list();
		  HibernateUtil.closeSession();

		  for (ListIterator iterator = users.listIterator(); iterator.hasNext();) {
		   UserTypeUser pu = (UserTypeUser) iterator.next();
		   System.out.println(pu.getName());
		   List emails = pu.getEmail();
		   for(int i = 0;i<emails.size();i++){
		    System.out.println(emails.get(i));
		   }
		  }
		 }

 

分享到:
评论

相关推荐

    Hibernate实战(第2版 中文高清版)

     1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不匹配   1.2.1 粒度问题   1.2.2 子类型问题   1.2.3 同一性问题   1.2.4 与关联相关的问题   1.2.5 数据导航的问题   ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 ...

    ssh(structs,spring,hibernate)框架中的上传下载

    3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。  通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。  以上是Spring+...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 ...

    hibernate3.6 文档(pdf 格式)

    1.1. Part 1 - The first Hibernate Application ................................................................ 1 1.1.1. Setup .............................................................................

    hibernate_test

    需要使用这个:添加到 build.gradle compile 'org.jadira.usertype:usertype.jodatime:2.0.1' add to *.hbm.xml 数据库详细信息:CREATE DATABASE datamanagerdb WITH OWNER = datamanageruser ENCODING = 'UTF8' ...

    synon2hbm-开源

    从Synon:2E中定义的数据模型生成Hibernate映射和Hibernate UserType(aka COOL:2E aka Advantage:2E aka AllFusion:2E)。

Global site tag (gtag.js) - Google Analytics