`
aasonwu
  • 浏览: 35564 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate 客户化映射类型--UserType

 
阅读更多


Hibernate 的客户化映射类型接口,允许用户以编程的方式创建自定义的映射类型,以实现把持久化类的任意类型的属性映射到数据库

以下例子可以把User类的Integer类型的phone属性映射到user表的varchar类型的phone字段

User.java

package com.wudasong.pojo;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

public class User implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5767515928671889957L;
	
	private Long id;
	private String name;
	private String email;
	private Integer phone;
	private byte sex;
	private Date birthday;
	private String mark;
	private String password;
	private Timestamp registerTime;
	
	public User(){}
	
	public Long getId() {
		return id;
	}
	@SuppressWarnings("unused")
	private void setId(Long id) {
		this.id = id;
	}
	//此处省略User类的其他属性的getXXX()和setXXX()方法

}

自定义UserType类

package com.wudasong.pojo;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

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

public class PhoneUserType implements UserType{
	
	private static final int[] SQL_TYPES={Types.VARCHAR};
	
	@Override
	public int[] sqlTypes() {
		return SQL_TYPES;
	}

	@Override
	public Class<Integer> returnedClass() {
		return Integer.class;
	}

	@Override
	public boolean equals(Object x, Object y) throws HibernateException {
		if(x==y){
			return true;
		}else if(x==null||y==null){
			return false;
		}else {
			return x.equals(y);
		}
	}

	@Override
	public int hashCode(Object x) throws HibernateException {
		return x.hashCode();
	}

	@Override
	public Object deepCopy(Object value) throws HibernateException {
		return value;
	}

	@Override
	public boolean isMutable() {
		return false;
	}

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

	@Override
	public Object assemble(Serializable cached, Object owner)
			throws HibernateException {
		return cached;
	}

	@Override
	public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
			throws HibernateException, SQLException {
		if(resultSet.wasNull()){
			return null;
		}else{
			String phone=resultSet.getString(names[0]);
			return new Integer(phone);
		}
	}

	@Override
	public void nullSafeSet(PreparedStatement statement, Object value, int index)
			throws HibernateException, SQLException {
		if(value==null){
			statement.setNull(index, Types.VARCHAR);
		}else {
			String phone=((Integer)value).toString();
			statement.setString(index, phone);
		}
	}

	@Override
	public Object replace(Object original, Object target, Object owner)
			throws HibernateException {
		return original;
	}

} 

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wudasong.pojo" schema="wudasong_work">
	<class name="User" table="user" dynamic-insert="true" dynamic-update="true">
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<property name="name" column="name" type="string" not-null="true" />
		<property name="email" column="email" type="string" not-null="true" />
                <!-- 自定义类型映射 -->
               <property name="phone" column="phone" type="com.wudasong.pojo.PhoneUserType" not-null="true" />
		<property name="sex" column="sex" type="byte" not-null="true" />
		<property name="birthday" column="birthday" type="date" />
		<property name="mark" column="mark" type="string" />
		<property name="password" column="password" type="string" not-null="true" />
		<property name="registerTime" column="registerTime" type="timestamp" insert="false" update="false"/>
	</class>
</hibernate-mapping>

说明:

PhoneUserType实现了org.hibernate.UserType接口的所有方法

  1. sqlTypes() 设置数据库中对应表的字段的类型,这里是varchar
  2. returnedClass() 设置数据库字段类型对应的Java类型,这里时Integer
  3. equals(Object x, Object y) hibernate会调用此方法比较当前对象是否和它的快照相同,参数x代表当前值,y代表有deepCopy()方法生成的属性快照值
  4. hashCode(Object x) 获得当前属性的hash码
  5. deepCopy(Object value) hibernate调用此方法生成快照的值,由于本例中Interger为不可变类,故直接返回value参数
  6. isMutable() 判断自定义属性类是否为可变类 ,此处Integer为不可变类,故返回false
  7. disassemble(Object value) 当hibernate把对象保存到第二缓存中时,调用此方法获得自定义属性的序列化数据
  8. assemble(Serializable cached, Object owner) 当hibernate从第二缓存中加载对象到session 时,调用此方法获得自定义属性(此例为:phone)的反序列化数据
  9. nullSafeGet(ResultSet resultSet, String[] names, Object owner) 当hibernate从数据库中加载对象时,调用此方法取得自定义属性的值
  10. nullSafeSet(PreparedStatement statement, Object value, int index) 当hibernate把对象持久化到数据库时,调用此方法把自定义属性的值添加到SQL 语句中
  11. replace(Object original, Object target, Object owner) 当session调用merge()方法把对象A融合到对象B时,调用此方法获得替代B对象的自定义属性的值

创建了PhoneUserType后,就可以以下面的方式实现自定义类型映射了

<property name="phone" column="phone" type="com.wudasong.pojo.PhoneUserType" not-null="true" />


附:

数据库user表scheme


CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `email` varchar(128) NOT NULL,
  `password` varchar(20) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `sex` tinyint(4) NOT NULL DEFAULT '-1',
  `birthday` date DEFAULT NULL,
  `mark` varchar(200) DEFAULT NULL,
  `registerTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;


分享到:
评论

相关推荐

    hibernate-jpa-2.1-api-1.0.0.draft-6-sources

    此外,Hibernate还提供了丰富的扩展点,比如拦截器(Interceptors)、事件监听器(Event Listeners)以及自定义的类型系统,这使得我们能够按照需求定制和优化持久化行为。通过阅读源码,我们可以了解到这些机制的...

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

     11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 ...

    包含客户化定制页面-BIEE管理员手册1.0

    ### 包含客户化定制页面-BIEE管理员手册1.0 #### 模型设计 **物理层设计** - **创建ODBC** - **步骤一:** 添加ODBC,选择SystemDSN,点击“Add”。 - **步骤二:** 选择Oracle数据库的驱动程序,单击Finish。 ...

    用友集团ERP客户化开发系列丛书-NC全册.pdf

    ### 用友集团ERP客户化开发系列丛书-NC全册.pdf 知识点解析 #### 一、前言与背景介绍 - **书籍背景**:本书作为用友软件股份有限公司内部培训资料的一部分,旨在帮助员工深入理解并掌握用友NC系统的客户化开发技术...

    JAVA培训-HIBERNATE的集合映射.doc

    在给定的文档“JAVA培训-HIBERNATE的集合映射.doc”中,主要讲解了Hibernate如何处理不同类型的集合映射,包括Set、List、Array、Map和Bag。我们将详细讨论这些集合映射以及它们在实际应用中的使用。 首先,我们来...

    hibernate 全面学习->hibernate 关联映射学习

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者...在实际项目中,根据具体需求选择合适的映射策略,结合源码分析和工具辅助,可以更高效地利用Hibernate这一强大的持久化框架。

    Hibernate3.x关联映射示例

    Hibernate 3.x 版本是其成熟且广泛使用的版本,提供了丰富的功能和优化,包括对象的持久化、查询语言HQL以及关联映射。本示例将深入探讨 Hibernate 3.x 中的关联映射,以帮助开发者更好地理解和应用这一关键技术。 ...

    Hibernate-Release-4.2.3

    8. **类型安全的HQL**:使用Hibernate EntityManager的`TypedQuery`接口,可以实现类型安全的HQL查询,降低运行时错误的风险。 9. **多租户支持**:Hibernate 4.2.3引入了多租户架构,允许在一个应用实例中同时处理...

    无废话Hibernate技术实用笔记

    Hibernate 是一款强大的Java ORM(对象关系映射)框架,它为开发者提供了在Java应用中操作数据库的简便方法。ORM工具的主要目标是减少开发者与数据库之间的交互复杂性,使得程序更加关注业务逻辑而非底层数据访问。 ...

    Hibernate 中的映射关系

    在Java的持久化框架Hibernate中,映射关系是核心概念之一,它负责将数据库的表结构与Java对象之间建立关联,使得数据操作更加便捷。以下是对每个映射关系的详细解释: 1. 一对多(One-to-Many):这种关系意味着一...

    hibernate-源代码-01

    该文件用于向Hibernate提供持久化类到关系型数据库的映射,每个映射文件的的结构基本都是相同 的,其普遍的代码形式如下所示。 Hibernate的配置文件,包含了连接持久层与映射文件所需的基本信息,其配置文件有两种...

    hibernate3.6 文档(pdf 格式)

    - **值类型**:分类介绍 Hibernate 中的值类型,包括基本类型和复杂类型。 - **实体类型**:描述实体类型的定义及其用途。 - **类型类别的重要性**:阐述不同类型类别在 Hibernate 中的意义。 - **自定义类型**:...

    Hibernate映射关联详解

    ### Hibernate映射关联详解 #### 一、理解一对多双向关联关系 在关系型数据库设计中,一对多关联是常见的数据组织方式之一。而在面向对象编程语言中,这种关系则通常通过集合(如Set或List)来实现。本文将重点...

    hibernate各种映射的配置

    在Java持久化框架Hibernate中,映射配置是连接数据库对象模型和Java对象模型的关键。本文将详细介绍四种常见的Hibernate映射关系:一对一、唯一外键一对一、简单多对一单向关联以及一对多双向关联。 1. 一对一映射...

    Hibernate-开发指南.pdf

    - **XDoclet与Hibernate映射**: 自动生成Java源代码和映射文件。 - **数据检索**: CriteriaQuery和HQL的使用。 - **数据关联**: 一对一、一对多、多对多关联的实现。 - **数据访问**: - **PO和VO**: 持久化对象...

    hibernate 一对多多对一的映射

    在Java持久化领域,Hibernate是一个非常重要的框架,它简化了对象关系映射(ORM)的过程,使得Java开发者能够更方便地操作数据库。本教程将详细讲解如何使用Hibernate来实现MySQL数据库中的一对多和多对一的映射关系...

    01-hibernate-Introduction_to_Hibernate

    Hibernate 是一个开源的对象关系映射 (ORM) 框架,用于 Java 应用程序中的数据库操作。它允许开发者将 Java 对象与数据库表进行映射,从而简化了数据持久化的操作。通过 Hibernate,开发者可以更加专注于业务逻辑的...

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

     11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 ...

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

     11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 ...

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

     11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 用UserType映射枚举类型  11.2.3 实现CompositeUserType接口  11.2.4 运行本节范例程序  11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 ...

Global site tag (gtag.js) - Google Analytics