Hibernate允许把OID定义为short,int,long以及他们的包装类型。
Hibernate的内置标识符有以下几种:
increment | 适用于逻辑主键.由hibernate自动以递增方式生成. |
identity | 适用于逻辑主键.由底层数据库生成标识符. |
sequence | 适用于逻辑主键.hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列. |
hilo | 适用于逻辑主键.hibernate通过high/low算法生成标识符. |
seqhilo | 适用于逻辑主键.使用一个高低位算法来高效地生成long,short,或者int类型的标识符. |
native | 适用于逻辑主键.根据底层数据库对自动生成标识符的方式,自动选择identity,sequence,hilo. |
uuid.hex | 适用于逻辑主键.hibernate采用128位的uuid算法生成标识符 |
uuid.string | 适用于逻辑主键.使用和uuid.hex同样的算法,uuid被编码成一个16字符长的字符串.不能使用在PostreSQL数据库中. |
assigned | 适用于业务主键.由java应用程序负责生成标识符. |
foreign | 适用于逻辑主键.使用另外一个相关联的对象的标识符 |
下面详细介绍几种常用的生成器。
1)Increment标识符生成器
HIbernate会以自增的方式生成标识符,事实上是在hibernate的初始化阶段读取将要操作的表中的最大的ID(select max(ID) from tableName),在向数据库中插入记录时再在此基础上递增。
这样就会存在并发的问题:如果同时有两个hibernate进程读取了这个最大值(假设为100),在向数据库中插入数据的时候都会想插入ID为101的记录,这样就违反了数据库的约束。这个问题只要是存在两个sessionFacotry就会发生,不能在集群下使用。
优点:生成标识符的机制不依赖于底层数据库,适用于所有的数据库系统。
2)Identity标识符生成器
identity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型,比如在MySql中应为auto_increment,SQL Server中为identity。
优缺点:必须依赖于底层数据库。
3)sequence标识符生成器
sequence标识符生成器利用底层数据库提供的序列来生成标识符(需要在数据库中创建一个序列)。
4)Native标识符生成器
native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择适用identity,sequence,hilo标识符生成器。native能自动判读底层数据库提供的生成符机制,如果为MySQL和SQL Server为identity,如果数据库为Oracle则为sequence。
5)assigned标识符生成器
由程序指定OID。