集群中 h2 和 MySQL 的休眠 id 生成器 AUTO_INCREMENT
Posted
技术标签:
【中文标题】集群中 h2 和 MySQL 的休眠 id 生成器 AUTO_INCREMENT【英文标题】:hibernate id generator AUTO_INCREMENT at h2 and MySQL in a cluster 【发布时间】:2012-06-30 04:14:47 【问题描述】:为了测试,我使用 H2 数据库。
对于生产来说,它是 MySQL。
我知道两者都支持AUTO_INCREMENT
(mysql / h2),但 Hibernate 似乎不能这样工作。
identity
支持 MySQL。很好。
H2呢?我应该编写自己的生成器还是...? (使用org.hibernate.id.IdentifierGenerator
接口作为文档says)。
我必须有一个干净而快速的方法来从数据库本身获取一个 ID(顺便说一下 long
类型),因为应用程序在一个集群中(即多个服务器 @987654328 @ 立即进入数据库)...这就是为什么increment
绝对不适合我。
谢谢!
【问题讨论】:
注意:使用 XML 映射。 【参考方案1】:您应该只用@GeneratedValue 注释需要生成值的id 属性。这将自动为您正在使用的数据库选择适当的生成策略。有关详细信息,请参阅GenerationType.AUTO
。
您的财产将如下所示:
@Id
@GeneratedValue
private long id;
【讨论】:
您好,谢谢。对不起,但是:1)我正在使用 XML 映射。 2) 我专门针对 MySQL 和 H2 的自动 id 生成功能,而不是 Hibernate 提供的替代方案,例如 HiLow 等。 OK 所以使用 XML 替代 @Generated 值。并且默认的生成策略会使用数据库自动生成id。 希望如此简单 -GenerationType.AUTO
的替代品是什么?你能看到吗(docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/…)?我没有。
我有点困惑。如果你告诉它,Hibernate 将使用底层数据库生成策略。
这正是我认为的 :)【参考方案2】:
使用原生生成器,例如
<id name="id" type="int">
<column name="id_column" />
<generator class="native" >
<param name="sequence">id_column_sequence</param>
</generator>
</id>
类native
的生成器使用数据库的最佳生成策略。在 MySql 的情况下,这是 auto_increment,在 Oracle 的情况下,这是一个序列(对于 H2,它也应该是一个序列,但我从未尝试过,因为我不使用 H2)。生成器参数sequence
仅在有用时使用,即。 e.对于 MySql 数据库,该参数被忽略,而对于 Oracle,它被使用。
通过这种方式,您可以为不同的数据库类型使用相同的映射文件(至少只要表名和列名相同)。
【讨论】:
为什么?你收到一个特殊的错误信息吗?native
也应该与 H2 一起使用。
@Johanna 我也有类似的问题。你愿意帮助我吗?这是链接:***.com/questions/25252541/…以上是关于集群中 h2 和 MySQL 的休眠 id 生成器 AUTO_INCREMENT的主要内容,如果未能解决你的问题,请参考以下文章