Hibernate 内置标识符策略整理

hibernate 提供了多种生成标志符的策略,一般这种标识符多会被用来作为数据表的主键。


比较常用的有:increment、sequence、identity、native、hilo
1、increment
适用于代理主键,由hibernate以递增的方式生成标识符,例如save(table_name),采用increment方式,hibernate在持久化table_name对象时,同时会采用select max(id) from table_name的方式得到标识符。
显而易见的好处:不依赖底层数据库的选择,并且有hibernate自动提供主键标识符的生成,无需程序的干预。
显而易见的坏处:如果同时进行多个持久化操作一个数据表中,会发生主键冲突的异常,因此不适用于分布式系统、不适用非线程安全性的持久化操作。
2、sequence
适用于代理主键,应该是比较常用的一种方式,缺点是对每个数据表的持久化操作,都得为其分配一个名称唯一的sequence,对数据库的依赖较大,但是也是最保险的一种方式,由数据库去保证主键的唯一性,并且不会冲突。
3、indentity
适用于代理主键,这种标识符策略需要底层数据库的支持,支持字段类型可以设置为自增。目前支持自增字段类型的数据库包括:DB2、MySQL、MS SQL Server、Sybase、HSQLDB、Informix;因此这种策略对于oracle数据库是不适用的。
4、native
适用于代理主键,根据数据库对自动标识符的支持能力,选择使用identity OR sequence OR hilo。
MySQL、MS SQL Server采用identity策略;
oracle使用sequence策略,因此需要手动建立一个全局hibernate_sequence,所有的标识符从这个序列中获取。
5、hilo
适用于代理主键,hibernate使用high/low算法生成标识符,使用hilo策略时需要建立特定表和特定字段,用来维护high值,hibernate每次获取标识符,会读取并修改特定表中的特定字段。


不推荐使用的有:
1、uuid.hex
适用于代理主键,hibernate使用uuid算法生成全网络唯一的字串标识符,但如果用这种标识符做主键,与整数类型相比即不方便与排序,同时也占用较大的存储空间。
2、assigned
适用于自然主键,assigned使用Java程序生成的标识符,由java程序负责主键标识符的生成和维护,无法保证其唯一性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值