(我用的是hibernate-release-5.2.10.Final)
(1)assigned:如单词的意思“赋值”,即让应用程序在save()之前为对象分配一个标示符。这是
(2)increment:Hibernate负责将主键自动增长,通过先查询表的max(id),在给所查到的值+1来实现自动增长。不建议使用,多线程会出现异常。
(3)sequence:Hibernate负责查询数据库中对应的序列名,实现自动增长。如下:
<generator class="sequence">
<!-- 需要注意:主键生成策略,在设置序列名时,name的属性必须为“sequence_name”;“seq_words”为数据库中已经设置好的序列名 -->
<param name="sequence_name">seq_words</param>
</generator>
如果不设置序列名,将导致Hibernate会自动查找缺省的序列名,会抛出异常如下:
Hibernate:
select
OFSEVEN.hibernate_sequence.nextval
from
dual
四月 22, 2017 2:47:01 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 2289, SQLState: 42000
四月 22, 2017 2:47:01 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-02289: 序列不存在
此设置与数据库直接有关,前提是数据库中必须支持序列且已经设置好了序列。
(4)hilo:前提条件==》需要使用一张额外的表保存一个long, short 或者 int类型的值,该值是通过高低位算法生成的主键值。即:在数据库中需要建立一张表(默认为)hibernate_unique_key,表中只需一个字段(默认为)next_hi。hibernate会通过高低位算法来生成一个值作为主键。(注意:高版本Hibernate中,现在的hilo已不能正常使用,我用的是5.2.1.Final,运行失败。)
(5)seqhilo:功能如其名,就是sequence与hilo的结合体; 与hilo同理,通过hi/lo算法实现的主键生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建一个sequence,适用于支持sequence的数据库;xml配置代码如下:
<generator class="seqhilo">
<param name="sequence">seq_words</param><!--name中的属性不要记错,否则hibernate会找不到对应的序列-->
</generator>
(6)identity:API文档中是这样写的“对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。”也就是,要求所用的数据库中可以设置主键自动增长。Oracle就不能用了,因为它没有自动增长的设置,只有序列设置。
(7)uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(因为使用了IP地址、纳秒级时间、芯片ID码等等)。UUID被编码为一个32位16进制数字的字符串。(注意:这是一个很长的字符串,需要提前设置好主键的类型,不然会报非法参数错误或者事务提交错误!)
(8)guid:使用数据库生成的GUID字符串(一个128位长的数字,用16进制表示)。与uuid相似,但是不同的是GUID的值是通过查数据库获得的,Hibernate自动查询代码如下:
Hibernate:
select
rawtohex(sys_guid())
from
dual
(9)native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。(注意:如果是Oracle数据库,会自动先选择序列sequence)
(10)select:通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。(感觉用不上,因为现在的数据库都有了自己的主键增长方式,Oracle有序列,MySql有auto_increment,SqlServer和Sybase有identity,DB2有identity和sequence)
(11)foreign:使用另外一个相关联的对象的标识符。通常和
<generator class="foreign">
<param name="property">wid</param><!--需要指明外键列-->
</generator>
<!--设置一对一的关联:name指明列名;class指明类;constrained表明存在外键与关联表对应,实行关联操作-->
<one-to-one name="wid" class="org.Words" constrained="true" />