`
黑猪王子
  • 浏览: 131583 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

hibernate 自定义类型 范例

阅读更多

在经历自己的不良自定义类型解决方案后 这次就老老实实的实现了UserType接口

 

参考的网上的部分实例,发现很多同志都是从一个范例的演变过来的,都还是新手写的(虽然我也是新手哈),存在一些问题,

不多说了,看看我的实现吧

 

实现了一个Set<String>类型

package com.heypig.db.hibernate.myType;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashSet;
import java.util.Set;

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

public class SetString implements UserType {
	/**
	 * 
	 * 在Hibernate中使用自定义类型需要实现org.hibernate.usertype.UserType接口,主要实现接口中的sqlTypes()、returnedClass()、isMutable()、equals()、deepCopy()、nullSafeGet()及nullSafeSet()方法。
	 * 
	 * int[] sqlTypes()方法要求返回自定义数据所在数据库字段的类型。类型通过java.sql.Types的类型常量来取得。
	 * 
	 * Class
	 * returnedClass()方法要求返回自定义数据在程序中的类型。如某自定义类型要将字符串转换成List,则这里返回List.class。
	 * 
	 * boolean isMutable()方法要求返回一个Boolean值,说明为本类型实例是否可变。注:不明白,默认为false。
	 * 
	 * Object deepCopy(Object
	 * obj)方法要求返回一个自定义类型的完全复制对象。说明:当nullSafeGet方法调用之后,我们获得自定义数据对象,在向用户返回自定义数据之前,deepCopy方法将被调用,它将根据自定义数据对象构造一个完全拷贝,并将此拷贝返回给用户使用。
	 * 
	 * Object nullSafeGet(ResultSet rs, String[] names,Object
	 * owner)在从ResultSet中读取标记为自定义类型的数据时,会调用本方法。一般都是在本方法中将数据库中数据转换为自定义类型数据。注:names数组中存放着本自定义类型所代表的列的列名。(一个自定义类型可以在多个列使用,所以这里用的是数组
	 * 下面加以说明)
	 * 
	 * nullSafeSet(PreparedStatement ps, Object value, int
	 * index)在PreparedStatement执行之前会调用本方法。一般都是在本方法中将自定义类型数据转换成数据库中的数据类型。
	 * 
	 * nullSafeGet()和nullSafeSet()方法其实像一个拦截器,在执行java<->数据库的操作之前将操作拦截下来,并将自定义数据转换成所需类型。
	 * nullSafeGet()是先通过org.hibernate.Hibernate.XXXType.nullSafeGet()方法来取得数据,然后将数据转换成自定义类型并通过return将其返回。
	 * 
	 * nullSafeSet()是将自定义类型转换成数据库表中规定的类型,再通过org.hibernate.Hibernate.XXXType.nullSafeSet()方法将数据传入操作流。
	 * 
	 * 
	 * 
	 */

	private static final String SPILTTER = ",";
	private static final int[] TYPES = new int[] { Types.VARCHAR };

	public Object assemble(Serializable cached, Object owner)
			throws HibernateException {
		if (cached == null) {
			return null;
		} else {
			return deepCopy(owner);
		}
	}

	public Object deepCopy(Object value) throws HibernateException {

		Set<String> stringSet = (Set<String>) value;
		if (stringSet==null) {
			return null;
		}
		Set<String> stringSetCopy = new HashSet<String>();
		for (String string : stringSet) {
			String stringCopy = new String(string);
			stringSetCopy.add(stringCopy);
		}
		return stringSetCopy;
	}

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

	public boolean equals(Object x, Object y) throws HibernateException {
		Set<String> sx = (Set<String>) x;
		Set<String> sy = (Set<String>) y;
		if (sx==null) {
			return false;
		}
		if (sx.equals(sy)) {
			return true;
		}
		return false;
	}

	public int hashCode(Object x) throws HibernateException {

		return ((Set<String>) x).hashCode();
	}

	public boolean isMutable() {
		// TODO Auto-generated method stub
		return false;
	}

	public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
			throws HibernateException, SQLException {
		String stringFromDb = (String) Hibernate.STRING.nullSafeGet(rs,
				names[0]);

		String[] strings = stringFromDb.split(SPILTTER);
		Set<String> set = new HashSet<String>();
		for (String s : strings) {
			set.add(s);
		}
		return set;

	}

	public void nullSafeSet(PreparedStatement st, Object value, int index)
			throws HibernateException, SQLException {
		if (value != null) {
			Set<String> setString = (Set<String>) value;
			String stringToDb = "";
			for (String s : setString) {
				stringToDb += (s + SPILTTER);
			}
			Hibernate.STRING.nullSafeSet(st, stringToDb, index);
		} else {
			Hibernate.STRING.nullSafeSet(st, value, index);
		}

	}

	public Object replace(Object original, Object target, Object owner)
			throws HibernateException {
		// TODO Auto-generated method stub
		return null;
	}

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

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

}

 

 

在xml映射里比普通类型的映射加一句type就ok了

<property name="newsCategorySet" type="com.heypig.db.hibernate.myType.SetString"></property>

1
0
分享到:
评论

相关推荐

    Hibernate实例 oracel数据库

    描述中提到"这是一个Hibernate实例,使用oracel数据库,并用junit和自定义类分别进行了测试",这暗示我们将深入学习如何配置Hibernate以连接Oracle数据库,以及如何利用JUnit进行单元测试和自定义测试类以确保代码的...

    hibernate中的集合映射范例程序

    在这个“hibernate中的集合映射范例程序”中,我们将深入探讨如何在Hibernate中进行集合映射,以及不同集合类型的应用场景。 首先,集合映射是Hibernate中处理一对多、多对多关系的核心机制。它允许我们将一个实体...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用07

    本资料"Struts2+Hibernate+Spring整合开发深入剖析与范例应用07"可能涉及的内容广泛,涵盖了这三大框架的集成和协同工作,帮助开发者构建高效、可维护的Web应用。以下是对这些知识点的详细解析: 1. **Struts2**: ...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.5. Seam 页面流:猜数字范例........................................................................................................................................ 40 1.5.1. 理解代码....................

    Java项目设计与开发范例

    在Java项目设计与开发范例中,我们涵盖了Java编程语言在实际项目中的应用,通过具体的案例来阐述如何高效地进行软件开发。以下是一些关键的知识点: 1. **面向对象编程**:Java是一种面向对象的语言,它提倡封装、...

    JSP宝典(PDF)

    JSP宝典PDF电子版下载,JSP宝典全书比较全面地介绍了有关JSP的相关知识,并通过大量实例,循序渐进地教会读者如何构架和...JSP宝典的第三部分对最为流行的MVC解决方案Struts和数据库持久层结束Hibernate作了重点介绍。

    Struts_2核心技术与Java_EE框架整合开发

    - **范例源程序**:随书提供的源代码示例,覆盖了所有知识点和实战案例。 - **课后习题**:每章末尾配有课后习题,帮助巩固所学知识。 #### 适用人群 - Java开发者:希望通过本书快速掌握Struts 2框架及其与其他...

    JSP开发实用技术整理

    16. 用户输入输出,文件输入输出范例(1) 19 17.以指定符号分割显示 22 17. 单例模式 22 18. 工厂模式 23 19. 读取配置文件(1) 25 20. 根据libName动态加载jar类库 33 =================================== ....

    javaEE学习笔记

    - **范例程序** - 实际操作示例,如通过编写简单的 shell 脚本来展示如何使用 Unix 命令。 - **网络基本命令** - 网络配置命令如 `ifconfig` 和 `ip`。 - 网络诊断工具如 `ping`, `traceroute`。 - 文件传输...

    ssh复合框架

    此外,它还支持拦截器机制,可以灵活地添加自定义的行为,如权限验证、日志记录等。 **Hibernate框架** 是一款强大的对象关系映射(ORM)工具,用于简化数据库操作。它允许开发者以面向对象的方式处理数据,无需...

    Seam - 语境相关的组件 .pdf

    Seam组件可以是无状态Session Bean、有状态Session Bean、实体Bean、JavaBeans、消息驱动Bean等,支持拦截器、多角色组件以及自定义作用域,为开发者提供了灵活的编程模型。 综上所述,Seam是一个强大的Java EE框架...

    Spring3.x企业应用开发实战源代码

    这一章节通常涉及Spring的AOP(面向切面编程)概念,包括切面、通知类型、自动代理以及如何自定义注解来实现切面。AOP是Spring中的一大亮点,它允许开发者将关注点分离,如日志、事务管理等,从核心业务逻辑中解耦...

    Repeater控件显示,NHibernate实现增删改

    在本示例中,"Repeater控件显示,NHibernate实现增删改"是一个综合性的应用,它将Repeater的灵活性与NHibernate的持久化能力结合在一起,提供了一个在ASP.NET Web应用程序中操作数据的实用范例。 首先,Repeater...

    JBPM4工作流应用开始指南.rar

    120 6.2.8 自定义活动 132 6.3 自动活动 134 6.3.1 java(Java程序活动) 135 6.3.2 script(脚本活动) 139 6.3.3 hql(Hibernate查询语言活动) 144 6.3.4 sql(结构化查询语言活动) 147 6.3.5 mail(邮件活动) ...

    jbpm4.4 简单请假流程

    综上,"jbpm4.4简单请假流程"项目展示了如何利用jbpm4.4的特性设计和实现一个典型的业务流程,涵盖了流程定义、任务处理、决策逻辑以及系统集成等方面,为企业级流程管理提供了实用范例。通过对这个项目的理解和实践...

    testSqlMap

    Ibatis 是一个轻量级的持久层框架,它不同于ORM(对象关系映射)框架如Hibernate,它并不完全自动化地管理数据库操作,而是允许开发者编写SQL语句,并将其与Java代码直接绑定,提供了更高的灵活性。在处理复杂的数据...

    java编码规范

    - **hibernate.cfg.xml**:Hibernate ORM框架的配置文件,用于配置数据库连接等。 - **ApplicationResources.properties**:存储程序英文资源的文件。 - **ApplicationResources_zh_CN.properties**:存储程序中文...

    JAVA上百实例源码以及开源项目源代码

    消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener 在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被...

Global site tag (gtag.js) - Google Analytics