Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性。
分为两种:内置映射类型和客户化映射类型。
一、内置映射类型
  1、Java基本类型的Hibernate映射类型

Java基础类型的Hibernate映射类型
Hibernate映射类型 Java类型 标准SQL类型 大小和取值范围
integer或者int int或者java.lang.Integer INTEGER  
long long BIGINT  
short short SMALLINT  
byte byte TINYINT  
float float FLOAT  
double double DOUBLE  
character char\String CHAR(1) 定长字符
string String VARCHAR 边长字符串
boolean boolean BIT  
yes_no boolean CHAR(1)  
true_false boolean CHAR(1)  

  2、Java时间和日期类型的Hibernate映射类型

Java的时间日期类型的Hibernate映射类型
映射类型 Java类型 标准SQL类型 描述
date java.util.Date或者java.sql.Date DATE 代表日期
time java.Util.Date或者java.sql.Time TIME 代表时间
timestamp java.Util.Date或者java.sql.Timpstamp TIMESTAMP 代表时间和日期
calendar java.Util.Calendar TIMESTAMP 同上
calendar_date java.Util.Calendar DATE 代表日期

  3、Java大对象类型的Hibernate映射类型

Java大对象类型的Hibernate映射类型
映射类型 Java类型 标准SQL类型 MySQL类型 Oracle类型
binary byte[] VARBINARY(或者BLOB) BLOB BLOB
text java.lang.String CLOB TEXT CLOB
serializable 实现Serializable接口的类 VARBINARY(或者BLOB) BLOB BLOB
clob java.sql.Clob CLOB TEXT CLOB
blob java.sql.Blob BLOB BLOB BLOB

  4、JDK自带的个别Java类的Hibernate映射类型

JDK自带的个别类的Hibernate映射类型
映射类型 Java类型 标准SQL类型
class java.lang.Class VARCHAR
locale java.util.Locale VARCHAR
timezone java.util.TimeZone VARCHAR
currency java.util.Currency VARCHAR

二、客户化映射类型
  通过实现org.hibernate.usertype.UserType接口即可,实现的是将一个Java类型如何映射为SQL类型。
  1、该接口的几个方法说明

sqlTypes():设置该类型的字段对应的SQL类型。比如VARCHAR。
returnClass():设置该类型的字段对应的Java类型。
isMutabel():判断对应的Java类型是否为可变类。
deepCopy(Object value):该方法用于生成对应属性的快照。对于可变类,必须返回参数的复制值。
equals(Object x, Object y):比较对应属性的当前值和它的快照是否相同。
hashCode(Object x):不做解释。
nullSaveGet(ResultSet resultSet,String[] names, Ojbect owner):
  当Hibernate从数据库加载对象时,调用该方法来取得该客户化类型的属性值。resultSet为JDBC的结果集,names为存放了表字段名的数组。在该方法内部实现从数据库字段到Java字段的转化。
nullSafeSet(PreparedStatement statement, Object value, int index):
  当Hibernate将对象持久化到数据库时,调用该方法把对应的属性值添加到SQL insert语句中。在该方法内部完成SQL语句的参数指定。
assemble(Serializable cached, Object owner):
  当Hibernate把二级缓存中的对象加载到Session缓存中时,调用该方法来获取对应属性的反序列化数据。如果参数cached为可变类型,则应该返回参数cached的快照(即调用deepCopy(cached))
disassemble(Object value):
  当Hibernate把Session缓存中的对象保存到二级缓存中时,调用该方法获取对应属性的序列化数据。如果参数value为可变类型,则应该返回参数cached的快照(即调用deepCopy(value))
replace(Object original, Object target, Object owner):
  当Session的merge()方法把一个游离对象A融合到持久化对象B时,会调用该方法来获得用于替代对象B对应属性的值。如果参数original为可变类型,则应该返回参数cached的快照(即调用deepCopy(original))

  2、配置文件使用

<property name="phone" type="xx.xx.MyType" column="PHONE"/>

  3、使用该方式替代Hibernate组件:方法就是将多个SQL字段在接口实现中封装为Address对象。

  4、实例代码

public class AddressUserType implements UserType {

  private static final int[] SQL_TYPES = {Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR};

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

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

  public boolean isMutable() { return false; }

  public Object deepCopy(Object value) {
return value; // Address is immutable
} public boolean equals(Object x, Object y) {
if (x == y) return true;
if (x == null || y == null) return false;
return x.equals(y);
} public int hashCode(Object x){
return x.hashCode();
} public Object nullSafeGet(ResultSet resultSet,String[] names, Object owner)
throws HibernateException, SQLException { String province = resultSet.getString(names[0]);
String city = resultSet.getString(names[1]);
String street = resultSet.getString(names[2]);
String zipcode = resultSet.getString(names[3]); if(province ==null && city==null && street==null && zipcode==null)
return null; return new Address(province,city,street,zipcode);
} public void nullSafeSet(PreparedStatement statement,Object value,int index)
throws HibernateException, SQLException { if (value == null) {
statement.setNull(index, Types.VARCHAR);
statement.setNull(index+1, Types.VARCHAR);
statement.setNull(index+2, Types.VARCHAR);
statement.setNull(index+3, Types.VARCHAR);
} else {
Address address=(Address)value;
statement.setString(index, address.getProvince());
statement.setString(index+1, address.getCity());
statement.setString(index+2, address.getStreet());
statement.setString(index+3, address.getZipcode());
}
} public Object assemble(Serializable cached, Object owner){
return cached;
} public Serializable disassemble(Object value) {
return (Serializable)value;
} public Object replace(Object original,Object target,Object owner){
return original;
}
}  

三、操纵Blob和Clob类型数据
  在持久化类中,二进制大对象可以声明为byte[]或者java.sql.Blob;字符串大对象可以声明为java.lang.String或者java.sql.Clob类型。
  暂不解释。

声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。

攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  2. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  3. 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序

    1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...

  4. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

    一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...

  5. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  6. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  7. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  8. 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略

    本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...

  9. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

随机推荐

  1. 浏览器JS脚本

    javascript: void((function() { alert("zeze"); })()) javascript:

  2. Hifiman:一个国产音频厂商的忧伤[转]

    一则苹果计划32亿美元收购音频设备厂商Beats的消息,让音频设备——这个极少被人们重视又时刻离不开的产品重新引发了关注. 国产数码品牌通常都被自然的贴上低端.低质的标签.然而难能可贵的是,国产音频设 ...

  3. C/C++程序员必须熟练应用的开源项目[转]

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...

  4. phpcms中action值的含义

    action值的含义:lists 内容数据(文章?)列表relation 内容相关文章hits 内容数据点击排行榜category 内容栏目列表position 内容推荐位列表

  5. saltstack/salt的state.sls的使用

    SLS(代表SaLt State文件)是Salt State系统的核心.SLS描述了系统的目标状态,由格式简单的数据构成.这经常被称作配置管理 首先,在master上面定义salt的主目录,默认是在/ ...

  6. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  7. jQuery Plugin Docs

    遮罩:BlockUI 对话框:Dialog 输入框:Mask Plugin 下拉框: 1.自定义的实现思路:将下拉框的选项定义为全局变量(数组),在html中定义点击事件并将数组变量转给响应函数,每次 ...

  8. 通过nsenter连接docker容器

    通常连接Docker容器并与其进行交互有四种方法.详情见:https://github.com/berresch/Docker-Enter-Demo,下面摘录nsenter连接的方式. 查看是否安装n ...

  9. 1. javacript高级程序设计-JavaScript简介

    JavaScript诞生于1995年,由Netscape公司布兰登·艾奇开发,JavaScript主要包括三个部分: (1). ECMAScript,由ECMA-262定义,提高核心语言功能 (2). ...

  10. bootstrap添加时间控件

    $('#startTime').daterangepicker({ singleDatePicker: true,format:"YYYY-MM-DD HH:mm:ss",time ...