.映射对象标识符
•
Hibernate
使用对象标识符
(OID)
来建立内存中的对象和数据库表中记录的对应关系
.
对象的
OID
和数据表的主键对应
. Hibernate
通过标识符生成器来为主键赋值
•
Hibernate
推荐在数据表中使用
代理主键
,
即不具备业务含义的字段
.
代理主键通常为整数类型
,
因为整数类型比字符串类型要节省更多的数据库空间
.
•
在对象
-
关系映射文件中
, <id>
元素用来设置对象标识符
. <generator>
子元素用来设定标识符生成器
.
•
Hibernate
提供了标识符生成器接口
:
IdentifierGenerator
,
并提供了各种内置实现
•
id
:设定持久化类的
OID
和表的主键的映射
–
name
:
标识持久化类
OID
的属性名
–
column
:
设置标识属性所映射的
数据表的
列名
(
主键字段的名字
).
–
unsaved-value
:
若设定了该属性
, Hibernate
会通过比较持久化类的
OID
值和该属性值来区分当前持久化类的对象是否为临时对象
–
type
:
指定
Hibernate
映射类型
. Hibernate
映射类型是
Java
类型与
SQL
类型的桥梁
.
如果没有为某个属性显式设定映射类型
, Hibernate
会运用反射机制先识别出
持久化类的特定属性的
Java
类型
,
然后自动使用与之对应的默认的
Hibernate
映射类型
–
Java
的基本数据类型和包装类型对应相同的
Hibernate
映射类型
.
基本数据类型无法表达
null,
所以对于持久化类的
OID
推荐使用包装类型
•
generator
:设定持久化类设定标识符生成器
–
class:
指定使用的标识符生成器全限定类名或其缩写名
.主键生成策略generator
•
Hibernate
提供的内置标识符生成器
:
.increment 标识符生成器
•
increment
标识符生成器
由
Hibernate
以递增的方式为代理主键赋值
•
Hibernate
会先读取
NEWS
表中的主键的最大值
,
而接下来向
NEWS
表中插入记录时
,
就在
max(id)
的基础上递增
,
增量为
1.
•
适用范围
:
–
由于
increment
生存标识符机制不依赖于底层数据库系统
,
因此它适合所有的数据库系统
–
适用于只有单个
Hibernate
应用进程
访问同一个数据库的场合
,
在集群环境下不推荐使用它
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
.sequence 标识符生成器
•
sequence
标识符生成器利用底层数据库提供的序列来生成标识符
.
•
Hibernate
在持久化一个
News
对象时
,
先从底层数据库的
news_seq
序列中获得一个唯一的标识号
,
再把它作为主键值
•
适用范围
:
–
由于
sequence
生成标识符的机制依赖于底层数据库系统的序列
,
因此
,
要求底层数据库系统必须支持序列
.
支持序列的数据库包括
: DB2, Oracle
等
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
hilo标识符生成器
•
hilo
标识符生成器由
Hibernate
按照一种
high/low
算法*生成标识符
,
它从数据库的特定表的字段中获取
high
值
.
•
Hibernate
在持久化一个
News
对象时
,
由
Hibernate
负责生成主键值
.
hilo
标识符生成器在生成标识符时
,
需要读取并修改
HI_TABLE
表中的
NEXT_VALUE
值
.
•
适用范围
:
–
由于
hilo
生存标识符机制不依赖于底层数据库系统
,
因此它适合所有的数据库系统
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常
native 标识符生成器
•
native
标识符生成器依据底层数据库对自动生成标识符的支持能力
,
来选择使用
identity,sequence
或
hilo
标识符生成器
.
•
适用范围
:
–
由于
native
能根据底层数据库系统的类型
,
自动选择合适的标识符生成器
,
因此很适合于跨数据库平台开发
–
OID
必须为
long,
int
或
short
类型
,
如果把
OID
定义为
byte
类型
,
在运行时会抛出异常