Hibernate内置对象标识符(OID)生成器

来源:互联网 发布:淘宝账号怎样手机申诉 编辑:程序博客网 时间:2024/06/01 15:56

1.increment标识符生成器:

<hibernate-mapping>    <class name="包名+类名" table="表名">        <id name="id" type="long" column="ID">            <meta attribute="scope-set">private</meta>            <generator class="incorement">        </id>    </class></hibernate-mapping>

Hibernate持久化一个对象的时候,会以自增的方式自动生成标识符。事实上Hibernate会首先取得最大的主键值,然后自增1,insert到数据库中.

当有多个进程的hibernate同时 操作数据库时,读取的最大键值相同,这样导致一个进程插入失败。

使用范围:

  • 不依赖底层的数据库系统,适合于所有的数据库系统。
  • 适应于只有单个hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用(发生主键冲突)
  • OID必须是long、int、short设置为byte时抛异常。

2.identity:

<hibernate-mapping>    <class name="包名+类名" table="表名">        <id name="id" type="long" column="ID">            <meta attribute="scope-set">private</meta>            <generator class="identity">        </id>    </class></hibernate-mapping>

要求底层数据库把主键设为自动增长:
MySql: auto_increament
MS SQL Server: identity

优点:不会发生increament方式的并发操作问题
使用范围:

  • 依赖于底层数据库,要求底层数据库必须支持自动增长字段类型
  • OID必须是long、int、short设置为byte时抛异常。

3.sequence:

<hibernate-mapping>    <class name="包名+类名" table="表名">        <id name="id" type="long" column="ID">            <meta attribute="scope-set">private</meta>            <generator class="sequence">        </id>    </class></hibernate-mapping>

hibernate持久化一个对象时,首先曾底层数据库系统的序列中获得一个唯一序列号,再把他设置成主键。

使用范围:

  • 要求数据库系统必须支持序列
  • OID必须是long、int、short设置为byte时抛异常。

4.native:

<hibernate-mapping>    <class name="包名+类名" table="表名">        <id name="id" type="long" column="ID">            <meta attribute="scope-set">private</meta>            <generator class="native">        </id>    </class></hibernate-mapping>

使用范围:

-与底层数据库无关性。根据数据库的方言,自动生成不同的主键生成方式。
适合跨数据库平台开发,根据数据库类型自动选择合适的标识符生成器**
- OID必须是long、int、short设置为byte时抛异常。

0 0