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程序负责主键标识符的生成和维护,无法保证其唯一性。

你可能感兴趣的:(Hibernate)