在经历自己的不良自定义类型解决方案后 这次就老老实实的实现了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>
分享到:
相关推荐
描述中提到"这是一个Hibernate实例,使用oracel数据库,并用junit和自定义类分别进行了测试",这暗示我们将深入学习如何配置Hibernate以连接Oracle数据库,以及如何利用JUnit进行单元测试和自定义测试类以确保代码的...
在这个“hibernate中的集合映射范例程序”中,我们将深入探讨如何在Hibernate中进行集合映射,以及不同集合类型的应用场景。 首先,集合映射是Hibernate中处理一对多、多对多关系的核心机制。它允许我们将一个实体...
本资料"Struts2+Hibernate+Spring整合开发深入剖析与范例应用07"可能涉及的内容广泛,涵盖了这三大框架的集成和协同工作,帮助开发者构建高效、可维护的Web应用。以下是对这些知识点的详细解析: 1. **Struts2**: ...
1.5. Seam 页面流:猜数字范例........................................................................................................................................ 40 1.5.1. 理解代码....................
在Java项目设计与开发范例中,我们涵盖了Java编程语言在实际项目中的应用,通过具体的案例来阐述如何高效地进行软件开发。以下是一些关键的知识点: 1. **面向对象编程**:Java是一种面向对象的语言,它提倡封装、...
JSP宝典PDF电子版下载,JSP宝典全书比较全面地介绍了有关JSP的相关知识,并通过大量实例,循序渐进地教会读者如何构架和...JSP宝典的第三部分对最为流行的MVC解决方案Struts和数据库持久层结束Hibernate作了重点介绍。
- **范例源程序**:随书提供的源代码示例,覆盖了所有知识点和实战案例。 - **课后习题**:每章末尾配有课后习题,帮助巩固所学知识。 #### 适用人群 - Java开发者:希望通过本书快速掌握Struts 2框架及其与其他...
16. 用户输入输出,文件输入输出范例(1) 19 17.以指定符号分割显示 22 17. 单例模式 22 18. 工厂模式 23 19. 读取配置文件(1) 25 20. 根据libName动态加载jar类库 33 =================================== ....
- **范例程序** - 实际操作示例,如通过编写简单的 shell 脚本来展示如何使用 Unix 命令。 - **网络基本命令** - 网络配置命令如 `ifconfig` 和 `ip`。 - 网络诊断工具如 `ping`, `traceroute`。 - 文件传输...
此外,它还支持拦截器机制,可以灵活地添加自定义的行为,如权限验证、日志记录等。 **Hibernate框架** 是一款强大的对象关系映射(ORM)工具,用于简化数据库操作。它允许开发者以面向对象的方式处理数据,无需...
Seam组件可以是无状态Session Bean、有状态Session Bean、实体Bean、JavaBeans、消息驱动Bean等,支持拦截器、多角色组件以及自定义作用域,为开发者提供了灵活的编程模型。 综上所述,Seam是一个强大的Java EE框架...
这一章节通常涉及Spring的AOP(面向切面编程)概念,包括切面、通知类型、自动代理以及如何自定义注解来实现切面。AOP是Spring中的一大亮点,它允许开发者将关注点分离,如日志、事务管理等,从核心业务逻辑中解耦...
在本示例中,"Repeater控件显示,NHibernate实现增删改"是一个综合性的应用,它将Repeater的灵活性与NHibernate的持久化能力结合在一起,提供了一个在ASP.NET Web应用程序中操作数据的实用范例。 首先,Repeater...
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的特性设计和实现一个典型的业务流程,涵盖了流程定义、任务处理、决策逻辑以及系统集成等方面,为企业级流程管理提供了实用范例。通过对这个项目的理解和实践...
Ibatis 是一个轻量级的持久层框架,它不同于ORM(对象关系映射)框架如Hibernate,它并不完全自动化地管理数据库操作,而是允许开发者编写SQL语句,并将其与Java代码直接绑定,提供了更高的灵活性。在处理复杂的数据...
- **hibernate.cfg.xml**:Hibernate ORM框架的配置文件,用于配置数据库连接等。 - **ApplicationResources.properties**:存储程序英文资源的文件。 - **ApplicationResources_zh_CN.properties**:存储程序中文...
消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener 在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被...