休眠自动增量

Posted

技术标签:

【中文标题】休眠自动增量【英文标题】:Hibernate Auto Increment 【发布时间】:2011-03-25 20:43:14 【问题描述】:

我正在使用 hibernate 的“增量”生成器来生成我的自动增量 ID。这工作正常,直到我不得不添加另一个应用程序,它也使用“增量”生成器来生成新的 id。我意识到增量生成器有一个问题:

"generates identifiers of type long, short or int that are unique only when no other process is inserting data into the same table. Do not use in a cluster."

有没有办法使用休眠来解决这个问题?或者我是否必须编写额外的代码来锁定表,检查数据库的最大 ID(然后增加它),最后释放锁?使用一种休眠配置不是一种选择。此外,我无法将 auto_increment 选项添加到 db 表中,因为我们在表上有多个键。

欢迎任何建议,我猜这是一个常见问题。

【问题讨论】:

【参考方案1】:

有several other generators 可以满足你的需要:

hilo 使用 hi/lo 算法来有效地生成 long、short 或 int 类型的标识符,给定一个表和列(默认情况下分别为 hibernate_unique_key 和 next_hi)作为 hi 值的来源。 hi/lo 算法生成仅对特定数据库唯一的标识符。 uuid:使用 128 位 UUID 算法生成在网络中唯一的字符串类型标识符(使用 IP 地址)。 UUID 被编码为长度为 32 位十六进制数字的字符串。

我建议看看hi/lo。

我也无法将 auto_increment 选项添加到 db 表中,因为我们在表上有多个键。

我觉得这句话令人困惑 - 如果表的主键使用多于一列,您不能让一列自动递增?

为什么你会有一个多列的主键,而其中一列是唯一的 - 这使得 id 字段不可能有一个以上的值,从而否定复合 PK 的目的.

【讨论】:

感谢您的回复。看来我必须为此算法创建另一个表来存储 hi 值。我们决定选择SP。关于主键,我只是简化了这里的问题。 id 并不总是自动递增。我们现在只是在测试它。 有时过度简化问题会让人感到困惑:)

以上是关于休眠自动增量的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠中映射自动增量字段?

休眠(mysql)刷新与提交中的自动增量

多个数据库的休眠自动增量字段

自动递增值并使用休眠设置从 1 开始

使用休眠注释自动递增和用户定义的 id

CentOS禁止自动休眠