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接口的所有方法
- sqlTypes() 设置数据库中对应表的字段的类型,这里是varchar
- returnedClass() 设置数据库字段类型对应的Java类型,这里时Integer
- equals(Object x, Object y) hibernate会调用此方法比较当前对象是否和它的快照相同,参数x代表当前值,y代表有deepCopy()方法生成的属性快照值
- hashCode(Object x) 获得当前属性的hash码
- deepCopy(Object value) hibernate调用此方法生成快照的值,由于本例中Interger为不可变类,故直接返回value参数
- isMutable() 判断自定义属性类是否为可变类 ,此处Integer为不可变类,故返回false
- disassemble(Object value) 当hibernate把对象保存到第二缓存中时,调用此方法获得自定义属性的序列化数据
- assemble(Serializable cached, Object owner) 当hibernate从第二缓存中加载对象到session 时,调用此方法获得自定义属性(此例为:phone)的反序列化数据
- nullSafeGet(ResultSet resultSet, String[] names, Object owner) 当hibernate从数据库中加载对象时,调用此方法取得自定义属性的值
- nullSafeSet(PreparedStatement statement, Object value, int index) 当hibernate把对象持久化到数据库时,调用此方法把自定义属性的值添加到SQL 语句中
- 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还提供了丰富的扩展点,比如拦截器(Interceptors)、事件监听器(Event Listeners)以及自定义的类型系统,这使得我们能够按照需求定制和优化持久化行为。通过阅读源码,我们可以了解到这些机制的...
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 #### 模型设计 **物理层设计** - **创建ODBC** - **步骤一:** 添加ODBC,选择SystemDSN,点击“Add”。 - **步骤二:** 选择Oracle数据库的驱动程序,单击Finish。 ...
### 用友集团ERP客户化开发系列丛书-NC全册.pdf 知识点解析 #### 一、前言与背景介绍 - **书籍背景**:本书作为用友软件股份有限公司内部培训资料的一部分,旨在帮助员工深入理解并掌握用友NC系统的客户化开发技术...
在给定的文档“JAVA培训-HIBERNATE的集合映射.doc”中,主要讲解了Hibernate如何处理不同类型的集合映射,包括Set、List、Array、Map和Bag。我们将详细讨论这些集合映射以及它们在实际应用中的使用。 首先,我们来...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者...在实际项目中,根据具体需求选择合适的映射策略,结合源码分析和工具辅助,可以更高效地利用Hibernate这一强大的持久化框架。
Hibernate 3.x 版本是其成熟且广泛使用的版本,提供了丰富的功能和优化,包括对象的持久化、查询语言HQL以及关联映射。本示例将深入探讨 Hibernate 3.x 中的关联映射,以帮助开发者更好地理解和应用这一关键技术。 ...
8. **类型安全的HQL**:使用Hibernate EntityManager的`TypedQuery`接口,可以实现类型安全的HQL查询,降低运行时错误的风险。 9. **多租户支持**:Hibernate 4.2.3引入了多租户架构,允许在一个应用实例中同时处理...
Hibernate 是一款强大的Java ORM(对象关系映射)框架,它为开发者提供了在Java应用中操作数据库的简便方法。ORM工具的主要目标是减少开发者与数据库之间的交互复杂性,使得程序更加关注业务逻辑而非底层数据访问。 ...
在Java的持久化框架Hibernate中,映射关系是核心概念之一,它负责将数据库的表结构与Java对象之间建立关联,使得数据操作更加便捷。以下是对每个映射关系的详细解释: 1. 一对多(One-to-Many):这种关系意味着一...
该文件用于向Hibernate提供持久化类到关系型数据库的映射,每个映射文件的的结构基本都是相同 的,其普遍的代码形式如下所示。 Hibernate的配置文件,包含了连接持久层与映射文件所需的基本信息,其配置文件有两种...
- **值类型**:分类介绍 Hibernate 中的值类型,包括基本类型和复杂类型。 - **实体类型**:描述实体类型的定义及其用途。 - **类型类别的重要性**:阐述不同类型类别在 Hibernate 中的意义。 - **自定义类型**:...
### Hibernate映射关联详解 #### 一、理解一对多双向关联关系 在关系型数据库设计中,一对多关联是常见的数据组织方式之一。而在面向对象编程语言中,这种关系则通常通过集合(如Set或List)来实现。本文将重点...
在Java持久化框架Hibernate中,映射配置是连接数据库对象模型和Java对象模型的关键。本文将详细介绍四种常见的Hibernate映射关系:一对一、唯一外键一对一、简单多对一单向关联以及一对多双向关联。 1. 一对一映射...
- **XDoclet与Hibernate映射**: 自动生成Java源代码和映射文件。 - **数据检索**: CriteriaQuery和HQL的使用。 - **数据关联**: 一对一、一对多、多对多关联的实现。 - **数据访问**: - **PO和VO**: 持久化对象...
在Java持久化领域,Hibernate是一个非常重要的框架,它简化了对象关系映射(ORM)的过程,使得Java开发者能够更方便地操作数据库。本教程将详细讲解如何使用Hibernate来实现MySQL数据库中的一对多和多对一的映射关系...
Hibernate 是一个开源的对象关系映射 (ORM) 框架,用于 Java 应用程序中的数据库操作。它允许开发者将 Java 对象与数据库表进行映射,从而简化了数据持久化的操作。通过 Hibernate,开发者可以更加专注于业务逻辑的...
11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 操纵Blob和Clob类型数据 11.4 小结 11.5 思考题 第12章 ...
11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 操纵Blob和Clob类型数据 11.4 小结 11.5 思考题 第12章 ...
11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 操纵Blob和Clob类型数据 11.4 小结 11.5 思考题 第12章 ...