Hibernate中标识符的类型和应用详解
标识符生成器 描述
Increment适用于代理主键。由hibernate自动以递增的方式生成标识符,每次增量为1
Identity适用于代理主键。由底层数据库生成标识符。条件是数据库支持自动增长数据类型。
Sequence适用于代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。
Hilo 适用于代理主键。 Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。 默认情况下,采用hibernate_unique_key表的next_hi字段。Native适用于代理主键。根据底层数据库对自动生成标识符的能力来选择identity、sequence、hilo
Uuid.hex 适用于代理主键。 Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。assigned 适用于自然主键。 由java程序负责生成标识符。不能把setID()方法声明为Private的。尽量避免使用自然主键。
====================
ncrement:使用increment方式时,hibernate将按照递增的方式设定主键,具体的方式是,先获取当前记录主键的最大值,然后再将该值加1作为主键。
select max(id) from table;
<id name=“id” type=“long” column=“ID”>
<generatorclass=“increment”/>
</id>
适用范围:
1。由于不依赖与底层数据库,适合所有的数据库系统。
2。单个进程访问同一个数据库的场合,集群环境下不推荐适用。
3。OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。====================
Identity:identity方式表示数据库的主键生成方式为采用数据库的主键生成机制,例如SQL Server或MySQL的自动主键生成机制。
由底层数据库生成标识符.需要把字段定义成自增型。
mysql中为auto_increment
mssqlserver中为identity
<generatorclass=“identity”/>
//////////////////////////////////////////
使用mysql
<generatorclass="identity">
<paramname="identity">auto_increment</param>
</generator>
mysql表:
createtableCUSTOMER(
IDintNOTNULLauto_incrementprimarykey,
NAMEvarchar(15)notnull,
EMAILvarchar(128)notnull
);====================
Sequence:这种方式针对由序列方式产生主键的数据库,例如Oracle。在<generator>的子元素<param name=“sequence”>指定用作产生
主键的序列名称。
<idname=“id”type=“long”column=“ID”>
<generatorclass=“sequence”>
<paramname=“sequence”>tester_id_seq</param>
</generator>
</id>适用范围:
底层数据库要支持序列。OracleDB2SAP等。
OID必须为long、int或shot类型,如果把OID定义为byte类型,运行时抛异常。====================
Hilo:Hilo标识符生成器由Hibernate按照一种hign/low算法来生成标识符,它从数据库的特定表的字段中获取high值。
<idname=“id”type=“long”column=“ID”>
<generatorname=“hilo”>
<paramname=“table”>hi_value</param>
<paramname=“column”>next_value</param>
<paramname=“max_lo”>100</param>
</generator>
</id>使用范围:
该机制不依赖于底层数据库,因此适用于所有的数据库系统。
OID必须为long、int、short类型,如果为byte类型的话,会抛出异常。
org.hibernate.id.IdentifierGeneratorException:thisidgeneratorgenerates
Long、integer、short。====================
Native:native方式意味着将主键的生成机制交由Hibernate决定,Hibernate会根据配置文件中的方言(Dialect)定义,采用不同的数据库特定的主键生成方式。
<id name=“id” type=“native” column=“ID”>
<generatorclass=“native”/>
</id>适用范围:
该类型能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据
库的平台,即在同一个应用中需要连接多种数据库系统的场合。
OID必须为long、int、short类型,如果为byte类型的话,会抛出异常。
Org.hibernate.id.IdentifierGeneratorException:thisidgeneratorgenerates
Long、integer、short。====================
assinged:assinged方式意味着将主键的生成机制交由应用程序自己控制。只需要在持久化之前传入对象主键值即可。
<id name=“id” column=“ID”>
<generatorclass=“assinged”/>
</id>====================
推荐的
hibernate增强的标识符生成器:org.hibernate.id.enhanced.TableGenerator:这个生成器定义了一个可以利用多个不同的键值记录存储大量不同增量值的表。
table_name(可选 — 默认是 hibernate_sequences):所用的表的名称
value_column_name(可选—默认为next_val):用于存储这些值的表的字段的名字
segment_column_name(可选,默认为sequence_name):用于保存"segmentkey"的字段的名
称
segment_value(可选,默认为default):我们为这个生成器获取增量值的segment的
"segmentkey"
initial_value(可选—默认是1):从表里获取的初始值
increment_size(可选 — 默认是 1):对表随后的调用应该区分的值<idname="id"type="long"column="id">
<generatorclass="org.hibernate.id.enhanced.TableGenerator">
<paramname="segment_value">customer</param>
</generator>
</id>====================
映射复合主键
<composite-id>
<key-propertyname="firstname"type="java.lang.String">
<columnname="FIRSTNAME"length="16"/>
</key-property>
<key-propertyname="lastname"type="java.lang.String">
<columnname="LASTNAME"length="16"/>
</key-property>
</composite-id>可以使用StudentsinfoId属性来设置联合主键
<composite-idname="id"class="com.oristand.StudentsinfoId">
<key-propertyname="firstname"type="java.lang.String">
<columnname="FIRSTNAME"length="16"/>
</key-property>
<key-propertyname="lastname"type="java.lang.String">
<columnname="LASTNAME"length="16"/>
</key-property>
</composite-id>
使用联合主键的持久化类需要实现serializable接口和覆盖equals()、
hashCode()方法。