Hibernate标识符生成策略
Java语言中按照内存地址来区分或识别一个类的不同对象,而关系型数据库按主键值来区分或识别同一个表的不同记录。作为一个优秀的ORM框架,Hibernate使用OID来协调这二者之间的矛盾。OID是关系数据库中的主键(通常是代理主键,也有自然主键)在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。
与表的代理主键对应,OID也是整数类型,Hibernate允许在持久化类中OID定义为以下整数类型:
- short(或Short):2个字节,取值范围:-2^15~~2^15-1
- int(或Integer):4个字节,取值范围:-2^31~~2^31-1
- long(或Long):8个字节,取值范围:-2^63~~2^63-1
通常由Hibernate或者底层数据库来给OID赋值,因此而可以把持久化类的OID的setId()访问权限设置为private,这样Hibernate能访问到而应用程序不能访问到,以防止Java应用程序随意修改OID,setId()设置为public,以使得Java应用程序能读取持久化对象的OID。
Hibernate提供了多种内置的标识符生成策略,它们的实现类都是实现了org.hibernate.id.IdentifierGenerator接口的。
下表为Hibernate提供的内置的标识符生成器:
标识符生成器 |
|
---|---|
increment | 适用于代理主键。由 Hibernate 自动以递增的方式生成标识符,每次增量为1 |
identity | 适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自增字段类型,例如 DB2、MySQL、MS SQL Server、Sybase 和 HypersonicSQL |
sequence | 适用于代理主键。Hibernate 根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列,例如 DB2、PostgreSQL、Oracle 和 SAP DB |
hilo | 适用于代理主键。Hibernate 根据 high/low 算法来生成标识符。Hibernate 把特定表的字段作为 "high" 值,在默认情况下选用 Hibernate_unique_key 表的next_hi字段 |
native | 适用于代理主键。根据底层数据库对自动生成标示符的支持能力,来选择 identity、sequence 或 hilo |
uuid.hex | 适用于代理主键。Hibernate 采用128位的 UUID(Universal Unique Identification)算法来生成标识符。UUID 算法能够在网络环境中生成唯一的字符串标识符。这话总标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。 |
assigned | 适用于自然主键。由 Java 应用程序负责生成标识符,为了能让 Java 应用程序设置OID,不能把 setId() 方法的访问权限设置为 private。应该尽量避免使用自然主键。 |
select | 适用于遗留数据库中的代理主键或自然主键。由数据库中的触发器来生成标识符。 |
foreign | 用另一个关联的对象的标识符来作为当前对象的标识符,主要只用于一对一关联的场合。 |
几种常见数据库支持的标识符生成器:
- MySQL: identity、increment、hilo、native
- MS SQL Server:identity、increment、hilo、native
- Oracle:sequence、seqhilo、hilo、increment、native
- 跨平台开发:native