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