所有抱怨社会不公和制度的人,翻译过来往往只有一句话:请给我金钱,女人和社会地位。
对象标识符是个什么玩意?
对象标识符(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。