Hibernate提供的内置标识符生成器

Hibernate提供的内置标识符生成器

Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录。Hibernate使用OID(对象标识符)来统一两者之间的矛盾,OID是关系数据库中的主键(通常称为代理主健)在Java对象模型中的等价物。

在对象-关系映射文件中,<id>元素用来设置对象标识符,比如:
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
          <generator class="identity" />
        </id>
<generator>元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多种内置的实现。例如: org.hibernate.id.IdentityGenerator; org.hibernate.id.IncrementGenerator;它们的缩写名分别为:identityincrement。在设置<generator>子元素的class属性时,既可以提供完整的标识符生成器的类名,也可以给定缩写名,因此以下两种方式是等价的。

        <id name="id" type="java.lang.Integer">

            <column name="ID" />

            <generator class="org.hibernate.id.IdentityGenerator" />

        </id>

           <!-- 或者 -->

        <id name="id" type="java.lang.Integer">
            <column name="ID" />
          <generator class="identity" />
        </id>


 

标识符生成器

        

increment  

    适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增加1
优点:由于它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。
缺点:只适合有单个Hibernate应用进程访问同一个数据库,在集群环境下不推荐使用它。 另外,OID必须为long,int,short类型,如果为byte类型,则会有异常。

identity 

适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。(oracle数据库不能用它)

sequence

适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。(oracle数据库能用它)

hilo  

适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为"high".在默认情况下选用hibernate_unique_key表的next_hi字段。它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。high/low算法生成的标识符只能在一个数据库中保证唯一。

native

适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity sequence hilo很适合于跨平台开发,即同一个Hibernate应用需要连接多种数据库系统。

uuid.hex

适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。这种标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。

assigned

适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID不能把setID()方法声明为private类型,应该尽量避免使用自然主键。

注意:     

1 代理主键:

 不具有义务含义,所以它可以适应不断变化的业务需求,它通常为整数类型,比如shortlongint,以及它们的包装类型。
2
自然主键:

具有业务含义。

3 几种常用数据库系统中可使用的标识符生成器:

MySQLidentityincrementhihonative

MS SQL Serveridentityincrementhihonative

Oraclesequenceidentityincrementhihonative

跨平台开发:native

 

几个例子:

1、如果主键字段为自增类型,
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlservernative就对应identity
Hiberante参考:

native
(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

2、如果主键字段不设置为自增,但是int型的,
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
hiberante参考:
increment
(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
在集群下不要使用。

3、如果使用uuid.hex产生的随机32位数最为主键,
那么数据库的id字段类型为char,长度为32
hbm.xml
中写为:
<generator class="uuid.hex" />
另外,uuid.string也是功能类似。

uuid.hex
产生的是32位的16进制数字的字符串。
uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bitUUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个3216进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值