1、assigned
主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。<id name="id" column="id">
<generator class="assigned" />
</id>2、increment
由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。<id name="id" column="id">
<generator class="increment" />
</id>3、hilo
hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。<id name="id" column="id">
<generator class="hilo">
<param name="table">hibernate_hilo</param>
<param name="column">next_hi</param>
<param name="max_lo">100</param>
</generator>
</id><id name="id" column="id">
<generator class="hilo">
<param name="max_lo">100</param>
</generator>
</id>4、seqhilo
与hilo类似,通过hi/lo算法实现的主键生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建sequence,适用于支持sequence的数据库,如Oracle。<id name="id" column="id">
<generator class="seqhilo">
<param name="sequence">hibernate_seq</param>
<param name="max_lo">100</param>
</generator>
</id>5、sequence
采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。6、identity
identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。7、native
native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。<id name="id" column="id">
<generator class="native" />
</id>8、uuid
UUID:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为: xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12) 其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。<id name="id" column="id">
<generator class="uuid" />
</id>9、guid
GUID:Globally Unique Identifier全球唯一标识符,也称作 UUID,是一个128位长的数字,用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。<id name="id" column="id">
<generator class="guid" />
</id>10、foreign
使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。<id name="id" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id> <one-to-one name="user" class="domain.User" constrained="true" />11、select
使用触发器生成主键,主要用于早期的数据库主键生成机制,能用到的地方非常少。12、其他注释方式配置
注释方式与配置文件底层实现方式相同,只是配置的方式换成了注释方式 自动增长,适用于支持自增字段的数据库@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)@Id
@GeneratedValue(strategy = GenerationType.AUTO)@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ud")
@TableGenerator(name = "ud",
table = "hibernate_table",
pkColumnName = "gen_pk",
pkColumnValue = "2",
valueColumnName = "gen_val",
initialValue = 2,
allocationSize = 5)@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ud")
@SequenceGenerator(name = "ud",
sequenceName = "hibernate_seq",
allocationSize = 1,
initialValue = 2)13、小结
1、为了保证对象标识符的唯一性与不可变性,应该让Hibernate来为主键赋值,而不是程序。 2、正常使用Hibernate维护主键,最好将主键的setter方法设置成private,从而避免人为或程序修改主键,而使用assigned方式,就不能用private,否则无法给主键赋值。 2、Hibernate中唯一一种最简单通用的主键生成器就是uuid。虽然是个32位难读的长字符串,但是它没有跨数据库的问题,将来切换数据库极其简单方便,推荐使用! 3、自动增长字段类型与序列数据库 | 自动增长字段 | 序列 |
MySQL | 是 | |
Oracle | 是 | |
DB2 | 是 | 是 |
MS SQL Server | 是 | |
Sybase | 是 | |
HypersonicSQL | 是 | |
PostgreSQL | 是 | |
SAP DB | 是 | |
HSQLDB | 是 | |
Infomix | 是 |
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情