您的位置:首页 > 编程语言 > Java开发

Hibernate的主键生成策略(hibernate的主键相关问题)

2016-03-25 08:23 381 查看
对于Hibernate的主键相关问题:

hibernate的主键生成有8中方式,下面一一列举这几种方式:

(1)increment,自增策略:

在每一次新增数据的时候,新纪录的主键是之前数据的主键最大值+1。

缺点:我们尽量不要使用increment这种方式,因为它有严重的并发性访问的问题。

事例:<generator class="increment"></generator>

(2)identity ,数据库主键策略

像mysql/sqlserver这些数据库,数据库是自带生成主键的策略的,所以在我们使用的时候,

我们可以使用identity的方式来完成,而对于oracle来说。我们就无法使用这种生成策略而是下面的sequence的方式了。

事例:<generator class="identity"></generator>

(3)sequence ,序列生成策略

对于oracle来说,我们使用sequence的方式生成主键。如下面的代码:class里写的是策略方式,而name里

是说明策略,值是对应的那个序列名字。

<generator class="sequence">
<param name="sequence">seq_emp</param>
</generator>

(4) hilo(highlow)高低值策略:

高低值策略不依赖数据库生成主键的特性,可以在任何数据库中进行兼容,高低值策略需要在数据库中增加一张表来维护主键的数据。

缺点:高低值算法执行效率较低,每一次都要产生写Hilo的工作,并且产生的结果不连续,造成主键区域的冗余浪费。

事例:

<generator class="hilo">

<param name="table">hilo</param>表名叫做hilo ,列名为value

<param name="column">value</param>

</generator>

(5)native本地策略:

这个策略会根据你设置的“数据库”(类似于我们的方言(oracle/mysql....)),来自动选择合适的生成策略。它是一种智能的序列生成策略。比如:

如果Hibernate的数据库方言是MySQLDialect , SQLServerDialect ,它自动会选择identity。

如果Oracle的时候会自动选择SEQUENCE。

其他的情况下,会尝试使用HILO算法。

事例:

<generator class="native">

<param name="table">hilo</param>表名叫做hilo ,列名为value

<param name="column">value</param>

<param name="sequence">seq_emp</param>

</generator>

(6)assigned 手动生成策略

这个策略是手动的去指定,不再自动生成。

就是自己在代码里自己给主键对应的那个字段赋值。

  (7)uuid与guid策略:

UUID:Universally Unique Identifier,是指在一台机子上生成的数字,它保证在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

GUID:Globally Unique Identifier全球唯一标识符,是一个128位长的数字,用16位进制表示。算法的核心思想是结合网卡、当地时间、一个随机数来生成GUID。从理论上讲,如果一个机器每秒产生100000000个GUID,则可保证3240年不重复。

注意:使用uuid与guid的时候,首先保证数据库中的主键的类型大小设置够这两个策略的大小,类型设置为字符串类型的数据类型。(与之对应的,你编辑的实体类也要改变类型的。)

<generator class="uuid"></generator>

(<generator class="guid"></generator>)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java hibernate 安全