我们在使用Hibernate的时候,该怎样配置主键生成器,此时就必须先对主键生成策略有一个基本的了解:
比如:
mysql不支持sequence增长方式, oracle不支持identity.
下面列出一张表,对hibernate内置主键生成器进行说明:
主键生成器 | 说明 |
increment | 适用于代理主键. 由Hibernate自动以递增的方式生成标识符. 每次增加1. 优点: 由于它的机制不依赖于底层数据库系统. 因此它适合于所有的数据库系统. 缺点: 只适合有单个Hibernate应用进程访问同一个数据库, 在集群环境下不推荐使用它. 另外, 需要注意:OID(主键)必须为 long, int , short类型, 如果为byte类型, 则会有异常. |
identity | 适用于代理主键. 由底层数据库生成标识符. 前提条件是底层数据库支持自动增长字段类型. (Oracle数据库不能用它) |
sequence | 适用于代理主键. Hibernate根据底层数据库的序列来生成标识符. 前提条件是底层数据库支持序列. (Oracle数据库能用它) |
hilo | 适用于代理主键. Hibernate根据high/low算法来生成标识符. Hibernate把特定表的字段作为"high"值. 在默认情况下选用 hibernate_unique_key表的next_hi字段. 它的机制.不依赖于底层数据库系统. 因此,它适合于所有的数据库系统. high/low 算法生成的标识符只能在一个数据库中保证唯一. |
native | 适用于代理主键.根据底层数据库对自动生成标识符的支持能力.来选择identity, sequence, hilo. 很适合于跨平台并发. 即同 一个Hibernate应用需要连接多种数据库系统. |
uuid.hex | 适用于代理主键. Hibernate采用128位的UUID算法来生成标识符. UUID算法能够在网络环境中生成唯一的字符串标识符. 这种标识符生成策略并不流行, 因为字符串类型的主键比整数类型的主键占用更多的数据库空间. |
assigned | 适用于自然主键. 由Java应用程序负责生成标识符, 为了能让Java应用程序设置OID(主键), 不能把setId()方法声明为private 类型. 应该尽量避免使用自然主键. |
参考:
http://www.cnblogs.com/jimorulang/p/5522189.html