7. 控制 insert 和 update语句 ( 1)
Hibernate在初始化阶段,就会根据映射文件的映射
信息,为所有的持久化类预定义以下 S QL 语句
insert 语句、 update语句、 delete语句和根据 OI D
来检索持久化类实例的 select 语句。
例如 S algrade类的语句如下:
INSERT INTO SALGRADE(GRADE, LOSAL, HISAL) VALUES(?, ?, ?);
UPDATE SALGRADE SET LOSAL=?, HISAL=?;
DELETE FROM SALGRADE WHERE ID=?;
SELECT GRADE,LOSAL,HISAL FROM SALGRADE WHERE GRADE=?;
www.sodi.com.cn
8. 控制 insert 和 update语句 ( 2)
以上 S QL 语句中的问号代表 JDB C P reparedS tatement 中的
参数。这些 S QL 语句都存放在 S essionFactory 的缓存中,当
执行 S ession 的 save( ) 、 update( ) 、 delete( ) 和 load( ) 方法时,
将从缓存中找到相应的预定义 S QL 语句,再把具体的参数
值绑定到该 S QL 语句中。
而 HQL 或 QB C 查询对应的 select 语句必须在执行该代码时
才能动态生成。
在对象 - 关系映射文件中,通过配置 < class> 和 < property>
元素的一些属性,可以控制 insert 和 update语句的生成,具
体参考 Hibernate_Reference中对象 / 关系数据库映射基础
( B asic O/R Mapping) 一章。
www.sodi.com.cn
11. 映射对象标识符
Java 语言按内存地址来识别或区分同一个类的不同
对象,而关系数据库按主键值来识别或区分同一
个表的不同记录。
Hibernate使用对象标识符( OI D )来建立内存中
的对象和数据库表中记录的对应关系,对象的
OI D 和数据库表的主键对应。
为了保证持久化对象的 OI D 的唯一性和不可变性
,应该让 Hibernate,而不是应用程序为 OI D 赋值
。
www.sodi.com.cn
15. increm 标识符生成器
ent
Hibernate启动时,这个生成器读取表的最大(数字
)主键列值,并且每次插入一个新行时值就增加
1 。生成的标识符类型为 long 、 short 或者 int 。
适用范围:
由于 increm 生成标识符的机制不依赖于底层数据库系
ent
统,因此它适用于所有的数据库系统。
适用于只有单个 Hibernate应用进程访问同一个数据库的
场合,在集群环境下不推荐使用它。
OI D 必须为 long 、 int 或 short 类型,如果 OI D 定义为
其他类型,在运行时会抛出
I dentifierGenerationE xception 。
www.sodi.com.cn
16. identity 标识符生成器
I dentity 标识符生成器由底层数据库来负责生成标
识符,它要求底层数据库将主键定义为自动增长
字段类型。
适用范围:
由于 identity 生成标识符的机制依赖于底层数据库系统
,因此,要求底层数据库系统必须支持自动增长字段类
型。支持自动增长字段类型的数据库包括:
DB 2 、 MyS QL 、 MS S QL S erver 、 S ybase、 HS QLDB
和 I nformix 等。
OI D 必须为 long 、 int 或 short 类型,如果 OI D 定义为
其他类型,在运行时会抛出
I dentifierGenerationE xception 。
www.sodi.com.cn
17. sequence标识符生成器
sequence标识符生成器利用底层数据库提供的序列
来生成标识符。
适用范围:
由于 sequence生成标识符的机制依赖于底层数据库系统
的序列,因此,要求底层数据库系统必须支持序列。支
持序列的数据库包括: Oracle、 DB 2 、 S A P DB 和
P ostpreS QL 等。
OI D 必须为 long 、 int 或 short 类型,如果 OI D 定义为
其他类型,在运行时会抛出
I dentifierGenerationE xception 。
www.sodi.com.cn
18. hilo 标识符生成器
hilo 标识符生成器由 Hibernate按照一种 hign/low 算
法来生成标识符,它从数据库的特定表的字段中
获取 hign 值,并通过添加本地的低值被变成唯一
。
适用范围:
由于 hilo 生成标识符的机制不依赖于底层数据库系统,
因此适用于所有的数据库系统。
OI D 必须为 long 、 int 或 short 类型,如果 OI D 定义为
其他类型,在运行时会抛出
I dentifierGenerationE xception 。
hign/low 算法生成的标识符只能在一个数据库中保证唯
一。
www.sodi.com.cn
19. uuid 标识符生成器
uuid 标识符生成器使用一个 128 位的全局唯一标
识符( Universally Unique I dentifier , UUI D )算法
生成字符串类型的标识符。 UUI D 包含本机的 I P
地址、本机 JVM 的信息,相对于同一时空中的所
有机器都是唯一的。
适用范围:
uuid 标识符生成器由 Hibernate维护并生成 uuid 值,不依
赖于底层数据库的实现细节,因而可以适用于所有数据
库。
由于 UUI D 的值是完全随机的,因此在数据库中,不能
确定记录的顺序。
仅当你全局地需要唯一标识符时才使用这个生成器策略
,并且是我们在不使用 JNI 的前提下的能做的最好实现
了。
www.sodi.com.cn
20. guid 标识符生成器
guid 标识符生成器利用底层数据库生成 guid 的函
数来生成字符串类型的标识符。
适用范围:
由于 guid 生成标识符的机制依赖于底层数据库系统,因
此,要求底层数据库必须支持 guid 。目前支持 guid 的数
据库有: Oracle、 MS S QL S erver 、 MyS QL 、 S ybase
等。
由于 UUI D 的值是完全随机的,因此在数据库中,不能
确定记录的顺序。
仅当你全局地需要唯一标识符时才使用这个生成器策略
。
www.sodi.com.cn
22. native标识符生成器
native标识符生成器依据底层数据库对自动生成标
识符的支持能力,来选择使用 identity 、 sequence或
hilo 标识符生成器。 native能自动判断底层数据库
提供的生成标识符的机制。
适用范围:
由于 native能根据底层数据库系统的类型,自动选择合
适的标识符生成器,因此很适合与跨数据库平台开发,
即同一个 Hibernate应用需要连接多种数据库系统的场合
。
OI D 必须为 long 、 int 或 short 类型,如果 OI D 定义为
其他类型,在运行时会抛出
I dentifierGenerationE xception 。
www.sodi.com.cn
property :为持久化类的每个属性提供 setXXX() 和 getXXX() 方法,可以灵活地封装持久化类,提高域模型的透明性。 field :如果 Customer 类没有为 name 属性提供 setName() 和 getName() 方法,就可以把 name 属性设为 field ,使 Hibernate 能直接访问 name 属性。