`

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));
		   }
		  }
		 }

 

分享到:
评论

相关推荐

    hibernate4.1中文api

    - **映射一对多关联**: 如何在一对多关联中使用外键或联合表。 - **自然id**: 使用非主键属性作为唯一标识。 - **任意**: 映射任意类型的数据。 - **属性**: 更多关于属性映射的细节。 - **hbm.xml特异性**: 在`.hbm...

    hibernate映射Oracle中LONG类型

    在 Hibernate 框架中,使用自定义类型映射 Oracle 中的 LONG 类型字段是一种常见的解决方案。通过实现 UserType 接口,我们可以定制 LONG 类型字段的读写操作。在本例中,我们定义了一个名为 CustomLong 的类,该类...

    hibernate3中文手册

    《Hibernate3中文手册》是Java开发领域中关于对象关系映射框架Hibernate的重要参考资料,它详尽地阐述了Hibernate3的使用方法和核心概念。Hibernate是一个开放源代码的对象关系映射框架,它允许开发者将数据库操作与...

    简要分析Java的Hibernate框架中的自定义类型

    在Java的Hibernate框架中,自定义类型是一种非常实用的功能,它允许开发者根据特定业务需求扩展Hibernate内置的数据类型。当我们发现Hibernate默认的数据类型无法满足我们存储数据的特殊要求时,例如需要处理复杂...

    Hibernate3.2EnumTypeMapping-demo.zip

    在Hibernate的映射文件(.hbm.xml)中,可以使用`&lt;typedef&gt;`元素定义枚举类型映射,例如: ```xml &lt;param name="enumClass"&gt;com.example.MyEnum&lt;/param&gt; ``` 然后在实体类的属性上使用这个类型: ```xml ...

    mysql 让hibernate支持text字段的方言

    在Hibernate的配置中,我们可以指定使用这个方言,使得Hibernate在处理`TEXT`字段时能够使用正确的SQL语句。 以下是一些关键步骤,以使Hibernate支持MySQL的`TEXT`字段: 1. **创建或扩展方言类**: - 如果现有的...

    用Hibernate实现领域对象的自定义字段

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...

    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(api 介绍).docx

    我们在 Hibernate 应用中使用最广泛的接口,也被称为持久化管理器,提供了相关的数据库操作,比如添、更、删、加、查等基本操作。特点:非线程安全,轻量级,其创建及销毁消耗资源少。每个客户请求对应一个 Session...

    Hibernate 配置跟数据库字段的对应关系

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...

    Hibernate4实战 之第七部分

    当需要持久化某些来自第三方库的Java类型时,如果这些类型没有提供适当的getter和setter方法,可以考虑实现`org.hibernate.UserType`接口来定义自定义类型。这样可以在不修改原有类的情况下完成持久化任务。 #### ...

    hibernate需要的jar包们

    在使用Hibernate时,确保正确配置并包含必要的JAR(Java Archive)文件至关重要,因为这些库提供了框架运行所需的功能。下面我们将详细探讨Hibernate所需的JAR包及其作用。 1. **hibernate-core.jar**:这是...

    动态添加hibernate domain的属性的例子

    在Hibernate中,动态添加属性的一个常见方法是使用动态扩展的Entity(Dynamic-Entity)。动态扩展Entity允许我们在运行时添加或移除属性,而无需重新编译和部署应用程序。这通常通过实现`org.hibernate.usertype....

    hibernate(api_介绍)

    Hibernate 是一个强大的 Java 持久化框架,它简化了数据库与对象之间的交互。通过提供一组丰富的API,Hibernate使得开发者能够在应用中轻松地管理和操作数据库数据。...理解并熟练使用这些接口是掌握Hibernate的关键。

    J2EE企业级项目开发-1期 04 Hibernate使用经验.doc

    在Hibernate中,使用`UserType`可以提升代码质量。`UserType`允许我们自定义数据类型的映射,以便更好地适应特定业务需求。 3. **自定义UserType实例**:例如,如果我们需要在`TUSER`表中存储用户的电子邮件,但不...

    hibernate annotations 中文文档

    《Hibernate Annotations 中文文档》是针对Hibernate框架注解配置的详细指南,旨在帮助开发者更深入地理解和使用Hibernate的注解功能。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发人员将数据库...

    精通 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 ...

    hibernate_persistence第02-16章书中源码

    在Hibernate中,你可以通过实现UserType接口来自定义数据类型的映射,使非标准的Java类型能够被持久化。"BKBLX"可能是对“备份策略”的简称,表明这部分内容可能涉及到如何自定义类型以适应特定的备份需求。 7. **...

    hibernate3.2API

    **hibernate3.2 API** 是一个针对Java开发者的重要框架,主要用于简化对象关系映射(ORM)的工作,使得在Java应用中操作数据库变得更加便捷。这个API提供了丰富的接口和类,帮助开发者将业务对象和数据库表之间的...

Global site tag (gtag.js) - Google Analytics