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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值