浅谈Hibernate之映射对象标示符(OID) (续)

Increment:

  Hibernate会先取数据库表中最大主键值,然后再插入一条记录时,会max(ID)基础上递增,增量为1。
   异常情况:
  如果有两个Hibernate进程同时访问系统,同时查询最大值相同,则有一个进程在插入数据时会失败。由此可见,increment仅仅在只有单个Hibernate进程访问数据库的情况下能正常工作。更确切的说,即使在同一个进程里创建链接同一数据库的多个sessionFactory实例,也会导致插入失败。
   解决方式:
  Hibernate通常作为JNDI资源运行在应用服务器上,如果Hibernate仅运行在单个应用服务器上,increment标示符生成器可以正常使用。如果hibernate运行在多个应用服务器上(即在集群环境下),increment标示符生成器不工作会失效。
   特点:
  (1)生成标识符机制不依赖于底层数据库,所以适用于任何数据库
  (2)适用于只有单个Hibernate应用进程访问同一个数据的场合,在集群环境下不推荐使用
  (3)OID必须为long、int或short类型,如果定义成byte类型,在运行时会抛出异常
 
indentity:
  indentity由底层数据库来生成标识符,它要求底层数据库把主键定义为自增长字段类型,并且在生成SQL语句时也不包括ID字段。
  特点:
  (1)底层数据库必须支持自动增长字段类型
  (2)OID必须诶long、int或short类型,如果定义为byte类型,会在运行时抛出异常
 
sequence:
  sequence又底层数据库来撑撑标识符,在生成SQL语句时包含ID字段,在持久化对象时,从底层数据库获得唯一的序列号。
  特点:
  (1)底层数据库必须支持序列
  (2)OID必须诶long、int或short类型,如果定义为byte类型,会在运行时抛出异常
 
hilo:
  Hibernate按照一种high/low算法生成标识符,从数据库特定表的字段中获取high值。
  特点:
  (1)不依赖于底层数据库系统,适用于所有数据库。
  (2)OID必须诶long、int或short类型,如果定义为byte类型,会在运行时抛出异常
  (3)high/low算法生成的标识符只能在已个数据库中保证唯一
  (4)当用户为Hibernate自行提供数据库连接,或者通过Hibernate通过JTA,从应用服务器的数据源获得数据库连接的时候无法使用hilo。(待考证)

native:
  native标识符依据底层数据库对自动生成标识符的支持能力,来自动选择使用identity、sequence或hilo标识符生成器。实际上类似于加了个判断条件,然后进入到对应的生成方式下。
  特点:
  (1)适用于跨数据库平台开发,即同一个Hibernate应用需要链接很多数据库系统。
  (2)OID必须诶long、int或short类型,如果定义为byte类型,会在运行时抛出异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值