Hibernate_对象标识符生成策略

所有抱怨社会不公和制度的人,翻译过来往往只有一句话:请给我金钱,女人和社会地位。

对象标识符是个什么玩意?
对象标识符(OID)来创建对象和数据库表里记录的对应关系。

通俗点说:全世界有那么多叫张三的人,但是每一个张三都有一个不一样的身份证号码。你绝对不能用名字来区分这些人,因为他们都叫张三。但是你可以用身份证号来区分他们,因为身份证号码是唯一的。对象标识符就是用来确定和记录的对应关系的玩意。

那么对象标识符生成策略有哪些?

1.increment

适用于代理主键,由Hibernate自动以增长的方式生成标识符,增量为1。使用increment,插入数据时,在生成的SQL语句中会有ID列。
Example:

     <id name="id" column="ID" type="long">
        <generator class="increment"/>
     </id>

适用范围:
* 由于increment生成标识符的机制不依赖于底层数据库系统,因此它适用于所有的数据库系统。
* 适用于只有单个Hibernate应用进程访问同一个数据库的场合,如果Hibernate 运行在多个应用服务器上,increment标识符生成器工作会失效。
* OID(Object identifier)必须为short、int、long类型或者他们的包装类型。如果定义为其他类型,则会抛出异常IdentifierGenerationException。

2.identity

适用于代理主键,由底层数据库生成标识符,前提:底层数据库支持自动增长字段类型。如:在MySql中主键定义为auto_increment,在SQL Server中主键定义为Identity.
Example:

     <id name="id" column="ID" type="long">
        <generator class="identity"/>
     </id>

适用范围:
* 由于identity生成标识符的机制依赖于底层数据库系统,因此要求底层数据库系统必须支持自动增长字段类型。支持自动增长的数据库有:DB2、SQL Server、MySql、Sybase、HSQLDB、Informix等。
* OID必须为short、int、long类型。

3.sequence

适用于代理主键,Hibernate根据底层数据库序列来生成标识符,前提:底层数据库支持序列。
Example:

    <id name="id" column="ID" type="long">
        <generator class="sequence">
          <param name="sequence">hibernate_sequence</param>
        </generator>
     </id>

适用范围:
* 由于sequence生成标识符依赖于底层数据库系统的序列,因此要求底层数据库系统必须支持序列。支持序列的数据库包括:Oracle、DB2等。
* OID必须为short、int、long类型。

4.hilo

适用于代理主键,Hibernate根据Hign/Low算法来生成标识符,Hibernate把特定表的字段作为"high"值,在默认情况下选用hibernate_unique_key表的next_hi字段。

Example:

    <id name="id" column="ID" type="long">
        <generator class="hilo"/>
         <param name="table">hi_value</param>
         <param name="column">next_value</param>
         <param name="max_lo">100</param>
     </id>
   注:其中high值存放在hi_value表的next_value字段中。

适用范围:
* 由于hilo生成标识符的机制不依赖于底层数据库系统,因此适用于所有的数据库系统。
* OID必须为short、int、long类型。

5.native

适用于代理主键,根据底层数据库对标识符的支持能力,自动选择identity、sequence或hilo。native能自动识别底层数据库提供的生成标识符的机制。如果数据库为sql/mysql则为identity;如果为Oracle则为sequence。
Example:

    <id name="id" column="ID" type="long">
        <generator class="native"/>
     </id>

适用范围:
* 由于native能根据底层数据库系统的类型自动选择合适的标识符生成器,因此适合跨数据库平台开发。即同一个Hiberante应用需要连接多种数据库系统的场合。
* OID类型。

6.assigned

适用于自然主键,由java应用程序负责生成标识符,应尽量避免使用自然主键。
Example:

     <id name="id" column="ID" type="string">
        <generator class="assigned"/>
     </id>

注:使用assigned标识符生成器时,无法使用saveOrUpdate来实现save/update。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值