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时抛异常。