集群中 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的主要内容,如果未能解决你的问题,请参考以下文章

如何配置休眠 jpa 以使用 mysql ndb(集群)

休眠 UUID 为 UUID 类型

H2 的休眠多租户问题:错误的架构

如何为 mysqlcluster 创建休眠配置文件?

postgres串行/大串行列的正确休眠ID生成器?

使用 MySQL 和 Oracle 进行休眠自动密钥生成