Hibernate 的类型

基本值类型

内置的basic mapping types可以大致地分类为:

integer, long, short, float, double, character, byte, boolean, yes_no, true_false

这些类型都对应 Java 的原始类型或者其封装类,来符合(特定厂商的)SQL 字段类型。boolean, yes_notrue_false都是 Java 中boolean或者java.lang.Boolean的另外说法。

string

java.lang.StringVARCHAR(或者 Oracle 的VARCHAR2)的映射。

date, time, timestamp

java.util.Date和其子类到 SQL 类型DATETIMETIMESTAMP(或等价类型)的映射。

calendar, calendar_date

java.util.Calendar到 SQL 类型TIMESTAMPDATE(或等价类型)的映射。

big_decimal, big_integer

java.math.BigDecimaljava.math.BigIntegerNUMERIC(或者 Oracle 的NUMBER类型)的映射。

locale, timezone, currency

java.util.Localejava.util.TimeZonejava.util.CurrencyVARCHAR(或者 Oracle 的VARCHAR2类型)的映射。LocaleCurrency的实例被映射为它们的 ISO 代码。TimeZone的实例被影射为它的ID

class

java.lang.ClassVARCHAR(或者 Oracle 的VARCHAR2类型)的映射。Class被映射为它的全限定名。

binary

把字节数组(byte arrays)映射为对应的 SQL 二进制类型。

text

把长 Java 字符串映射为 SQL 的CLOB或者TEXT类型。

serializable

把可序列化的 Java 类型映射到对应的 SQL 二进制类型。你也可以为一个并非默认为基本类型的可序列化 Java 类或者接口指定 Hibernate 类型serializable

clob, blob

JDBC 类java.sql.Clobjava.sql.Blob的映射。某些程序可能不适合使用这个类型,因为 blob 和 clob 对象可能在一个事务之外是无法重用的。(而且, 驱动程序对这种类型的支持充满着补丁和前后矛盾。)

imm_date, imm_time, imm_timestamp, imm_calendar, imm_calendar_date, imm_serializable, imm_binary

一般来说,映射类型被假定为是可变的 Java 类型,只有对不可变 Java 类型,Hibernate 会采取特定的优化措施,应用程序会把这些对象作为不可变对象处理。比如,你不应该对作为imm_timestamp映射的 Date 执行Date.setTime()。要改变属性的值,并且保存这一改变,应用程序必须对这一属性重新设置一个新的(不一样的)对象。

实体及其集合的唯一标识可以是除了binaryblobclob之外的任何基础类型。(联合标识也是允许的,后面会说到。)

org.hibernate.Hibernate中,定义了基础类型对应的Type常量。比如,Hibernate.STRING代表string类型。

自定义值类型

开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化java.lang.BigInteger类型的属性,持久化成为VARCHAR字段。Hibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。比如说,你可能有这样的 Java 属性:getName()/setName(),这是java.lang.String类型的,对应的持久化到三个字段:FIRST_NAMEINITIALSURNAME

要实现一个自定义类型,可以实现org.hibernate.UserTypeorg.hibernate.CompositeUserType中的任一个,并且使用类型的 Java 全限定类名来定义属性。请查看org.hibernate.test.DoubleStringType这个例子,看看它是怎么做的。

<propertyname="twoStrings"type="org.hibernate.test.DoubleStringType"><columnname="first_string"/><columnname="second_string"/></property>

注意使用<column>标签来把一个属性映射到多个字段的做法。

CompositeUserTypeEnhancedUserTypeUserCollectionTypeUserVersionType接口为更特殊的使用方式提供支持。

你甚至可以在一个映射文件中提供参数给一个UserType。 为了这样做,你的UserType必须实现org.hibernate.usertype.ParameterizedType接口。为了给自定义类型提供参数,你可以在映射文件中使用<type>元素。

<propertyname="priority"><typename="com.mycompany.usertypes.DefaultValueIntegerType"><paramname="default">0</param></type></property>

现在,UserType可以从传入的Properties对象中得到default参数的值。

如果你非常频繁地使用某一UserType,可以为他定义一个简称。这可以通过使用<typedef>元素来实现。Typedefs 为一自定义类型赋予一个名称,并且如果此类型是参数化的,还可以包含一系列默认的参数值。

<typedefclass="com.mycompany.usertypes.DefaultValueIntegerType"name="default_zero"><paramname="default">0</param></typedef>
<propertyname="priority"type="default_zero"/>

也可以根据具体案例通过属性映射中的类型参数覆盖在 typedef 中提供的参数。

尽管 Hibernate 内建的丰富的类型和对组件的支持意味着你可能很少需要使用自定义类型。不过,为那些在你的应用中经常出现的(非实体)类使用自定义类型也是一个好方法。例如,一个MonetaryAmount类使用CompositeUserType来映射是不错的选择,虽然他可以很容易地被映射成组件。这样做的动机之一是抽象。使用自定义类型,以后假若你改变表示金额的方法时,它可以保证映射文件不需要修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值