Hibernate 主键自动增长策略.docx
《Hibernate 主键自动增长策略.docx》由会员分享,可在线阅读,更多相关《Hibernate 主键自动增长策略.docx(11页珍藏版)》请在冰豆网上搜索。
Hibernate主键自动增长策略
标识符属性生成策略与对象识别
1、什么是标识符属性
Hibernate中的标识符属性,也可以称为Hibernate主键,它赋予每个持久化对象独一无二的数值,以此区分不同的持久化对象。
在Hibernate的映射问津(*.hbm.xml)中,元素定义了持久化类的标识符属性的名称、类型和与数据库表中字段的映射
元素的子元素则用来设置当前持久化类的标识符属性的生成策略
2、标识符属性的生成策略
1)increment生成策略
原理:
从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值
配置代码:
好处:
兼容性比较强,在任何数据库都可以使用。
2)identity生成策略
原理:
在MSSQLServer、MySQL和DB2等数据库中,都可以设置表中某一个字段的数值自动增长,而identity生成策略就是通过使用这种方式,为当前的记录获取主键值的同时为持久化对象赋予标识符属性值
配置代码:
限制:
必须是数据库支持字段的值自动增长,Oracle就不行
3)sequence生成策略
原理:
在Oracle、DB2和PostgreSQL等数据库中创建一个序列(sequence),然后Hibernate通过序列为当前的记录获取主键值,进而为持久化对象赋予标识符属性
代码:
gb_seq
4)hilo生成策略(高低位生成策略)
原理:
hilo生成策略采用一种成为高/低位(hi/lo)的高效算法,产生的标识符属性值为long、short、int以及他们封装类的类型
代码:
hibernate_key
next_hivalue
解释说明:
在hibernate使用中,需要现在数据库中建立这个表以及这个字段,并为这个字段设一个值
5)seqhilo(序列高低位)生成策略
原理:
seqhilo生成策略使用的还是高/低位算法,产生的标识符属性值为long、short、int以及他们封装类的类型。
与hilo生成策略不同的是,它使用指定的sequence获取高位值
配置代码:
hibernate_seq
注意:
只能运行在支持序列的数据库中,如Oracle。
在MySQL中就不能使用
6)uuid生成策略
原理:
uuid生成策略采用128位的UUID算法来生成一个字符串类型的主键值,这个算法使用IP地址、JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在当前的JVM中唯一)经过计算来产生标识符属性值,可以用于分布式的Hibernate应用中
代码:
优势:
适用性非常广,各种数据库中都可以用、效率高,生成快不重复
劣势:
产生的值不是数字,是字符串,不便于排序
7)Guid生成策略
原理:
这种标识符属性生成策略,借助MSSQLServer或者MySQL数据库中的GUID字符串产生标识符属性值.仅限于这两种数据库,Oracle不具备GUID机制。
配置代码:
8)native生成策略
原理:
让Hibernate自己根据所使用的数据库的支持能力,从identity、sequence或者hilo生成策略中选择一种标识符属性生成方式
配置代码:
9)assigned生成策略
原理:
使用assigned生成策略表示由Hibernate应用自助指定标识符属性的数值,也就是说,在调用Session对象的save()方法持久化对象时,需要先对持久化对象的标识符属性赋值。
配置代码:
配置部分
程序中
备注:
它可以是整型,也可以是字符串
优势:
主动性很强,完全属于本身控制
劣势:
它相当于程序员本身包办,所以你在程序中需要给定值…你每次运行都需要更改,否则值就重复了
10)foreign生成策略
foreign生成策略通过所关联的持久化对象,为当前持久化对象设置标识符属性值.也就是说当前持久化对象的主键值不是其本身生成的,是别人给的主键值,它的主键值就是个外键值
配置代码:
user
11)使用主键类映射符合主键
使用这种方式映射复合主键,持久化类需要使用一个单独的主键类对复合主键进行映射,主键类中的属性就是与映射符合主键字段的属性。
例:
我有一个用户表,用户表的设计如下:
在这个表里,没有如我们之前设计的没有ID作为主键的字段,这种情况下,我们就可以用1~多个的字段来组合成主键。
例如username+birthdate
第一种方法:
属性符合主键
POJO代码:
多添加一个构造方法,用来接收复合主键的值
映射文件配置:
在new对象的时候,因为用户名和出生日期是符合主键,所以代码如下:
第二种方法:
通过主键类实现复合主键的映射
自定义一种主键类,在当前的持久化类当中使用这个主键类的类型作为当前这个持久化类对象的主键值。
在这个USER表中,我们用的用户名和出生年月做得复合主键,那么我们可以把这两个属性单独放在一个类里面。
操作如下:
User.java
UserId.java
配置文件:
开发代码:
备注:
在使用主键类或者属性符合主键的时候,Hibernate为了能区分出不同的对象,需要在主键类中提供重写的hashcode()、equals()方法
如果不采用重写,则可以Commonslangbuilder组件帮我们生成hashCode()、equals()、toString()等方法。
这种方法生成的可读性更强
Commonclipse的使用
下载网址:
利用ApacheCommonslangbuilder来自动生成toString()、hashCode()、equals()和compareTo()方法的代码
使用方法
1、去下载下来解压,解压后得到这两个目录
2、将这两个目录拷贝到myeclipse的安装路径下的
目录下。
重启myeclipse
3、在程序的主键类中,点击右键就可以找到
4、
5、生成后,有两个类找不到:
解决办法:
下载Commonslangbuider类库,导入项目中
其他知识补充点:
如果在程序中使用的是
Sessionsession=sessionFactory.getcurrentSession();
那么在hibernate.cfg.xml配置中,需要加入这个配置:
指定当前的session对象与事务线程绑定。
如果不愿意使用那种方法,则使用Sessionsession=sessionFactory.openSession();