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;
分享到:
相关推荐
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 PDF 文档
用友集团ERP客户化开发系列丛书-NC全册.pdf 用友集团ERP客户化开发系列丛书-NC全册.pdf
NC55客户化开发培训-数据交换平台 NC外部交换平台 外部交换平台工作原理 格式转换 业务插件与业务服务 外系统数据导入的一般步骤 注册外部系统 准备外系统数据 配置辅助信息 设置基础数据对照 配置Servlet的URL...
U8快速开发工具是针对客户化开发的特点,基于U8平台而开发的一套简化、快速、高效的U8单据开发工具。使用快速开发工具开发的单据与U8标准单据风格一致,可通过数据库脚本的简单调整设置单据上字段格式(文本、日期、...
该文件用于向Hibernate提供持久化类到关系型数据库的映射,每个映射文件的的结构基本都是相同 的,其普遍的代码形式如下所示。 Hibernate的配置文件,包含了连接持久层与映射文件所需的基本信息,其配置文件有两种...
客户关系-客户关系系统-客户关系系统源码-客户关系管理系统-客户关系管理系统java代码-客户关系系统设计与实现-基于springboot的客户关系系统-基于Web的客户关系系统设计与实现-客户关系网站-客户关系网站代码-客户...
客户关系-客户关系系统-客户关系系统源码-客户关系管理系统-客户关系管理系统java代码-客户关系系统设计与实现-基于springboot的客户关系系统-基于Web的客户关系系统设计与实现-客户关系网站-客户关系网站代码-客户...
相信很多做过“皇冠足球投注平台或维护”或者一些经常需要变更服务器的技术人员来说,会有一个很头痛的技术问题:那就是客户要求经常要求更换服务器(至少更换IP)。 大部分情况都是直接把程序安装到新的服务器...
梯查查小程序客户使用文档2018-12-1.pdf梯查查小程序客户使用文档2018-12-1.pdf梯查查小程序客户使用文档2018-12-1.pdf梯查查小程序客户使用文档2018-12-1.pdf梯查查小程序客户使用文档2018-12-1.pdf梯查查小程序...
梯查查小程序客户使用文档2018-12-1.docx梯查查小程序客户使用文档2018-12-1.docx梯查查小程序客户使用文档2018-12-1.docx梯查查小程序客户使用文档2018-12-1.docx梯查查小程序客户使用文档2018-12-1.docx梯查查小...
企业客户信息反馈-企业客户信息反馈平台-企业客户信息反馈平台源码-企业客户信息反馈平台java代码-企业客户信息反馈平台设计与实现-基于springboot的企业客户信息反馈平台-基于Web的企业客户信息反馈平台设计与实现-...
11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 操纵Blob和Clob类型数据 11.4 小结 11.5 思考题 第12章 ...