1. increment标识符生成器
Hibernate: select max(ID) from CUSTOMER
Hibernate: insert into CUSTOMER (NAME, PHONE, MARRIED, ID) values (?, ?, ?, ?)
- 由于increment生成标识符的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统;
- 适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用它;
- OID必须为long、int或short类型。
2. identity标识符生成器
'CREATE TABLE `customer` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT, // !!!
`NAME` varchar(255) DEFAULT NULL,
`EMAIL` varchar(255) DEFAULT NULL,
`PASSWORD` varchar(255) DEFAULT NULL,
`PHONE` int(11) DEFAULT NULL,
`MARRIED` bit(1) DEFAULT NULL,
`ADDRESS` varchar(255) DEFAULT NULL,
`SEX` char(1) DEFAULT NULL,
`DESCRIPTION` longtext,
`IMAGE` tinyblob,
`BIRTHDAY` date DEFAULT NULL,
`REGISTEREDTIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8'
Hibernate: insert into CUSTOMER (NAME, PHONE, MARRIED) values (?, ?, ?)
Hibernate: select last_insert_id()
- 由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型。支持的数据库有:DB2、MySQL、Ms SQL Server、Sybase、HSQLDB和Informix等;【注】Oracle不支持!
- OID必须为long、int或short类型。
3. sequence标识符生成器
- 由于sequence生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列。支持的数据库有:Oracle、DB2、SAP DB和PostgreSQL等;【注】Mysql不支持!
- OID必须为long、int或short类型。
4. hilo标识符生成器
'CREATE TABLE `hibernate_unique_key` (
`next_hi` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
Hibernate: select next_hi from hibernate_unique_key for update
Hibernate: update hibernate_unique_key set next_hi = ? where next_hi = ?
Hibernate: insert into CUSTOMER (NAME, PHONE, MARRIED, ID) values (?, ?, ?, ?)
- 由于hilo生成表和自负的机制不依赖于底层数据库系统,因此适用于所有的数据库系统;
- high/low算法生成的标识符只能在一个数据库中保证唯一;
- OID必须为long、int或short类型。
- 根据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo标识符生成器。Mysql和MS SQL Server会选择identity,Oracle选择sequence;
- 适合于跨数据库平台开发,即同一个Hibernate应用需要连接多种数据库系统的场合;
- OID必须为long、int或short类型。