【问题标题】:Hibernate_sequence table is generated生成hibernate_sequence表
【发布时间】:2017-05-18 14:15:51
【问题描述】:

我有生成策略 AUTO 的 id 列,我想知道,为什么 MySql 生成 hibernate_sequence 表?我以为hibernate会选择IDENTITY id生成策略

<mapped-superclass class="com.cl.xlp.model.data.Identity">
    <attributes>
        <id name="id">
            <column name="id" />
            <generated-value strategy="AUTO" />
        </id>
    </attributes>
</mapped-superclass>

休眠属性

hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update

Mysql 连接器版本

version.mysql.connector>5.1.39</version.mysql.connector>

Mysql服务器版本为5.6.12

【问题讨论】:

  • Hibernate 中 AUTO 的后备策略是 SEQUENCE,但是由于 MySQL 不支持序列,Hibernate 使用表来模拟它们。将您的策略​​更改为 IDENTITY。

标签: java mysql hibernate


【解决方案1】:

如果您使用strategy="AUTO",Hibernate 将生成一个名为hibernate_sequence 的表,为ID 序列提供下一个数字。您可能忘记将AutoIncrement 功能添加到您的表的PK。

您可以使用生成策略strategy="IDENTITY" 强制使用MySql 中可用的AutoIncrement 功能并避免创建表。

【讨论】:

    【解决方案2】:

    从 Hibernate 5.0 版开始,Hibernate 解释 AUTO 生成类型的方式发生了变化。

    当使用 Hibernate v 4.0 和作为 AUTO 的生成类型时,特别是对于 MySql,Hibernate 将选择 IDENTITY 策略(因此使用 AUTO_INCREMENT 功能)为相关表生成 ID。

    从 5.0 版开始,当 Generation Type 选择为 AUTO 时,Hibernate 使用SequenceStyleGenerator 而不管数据库如何。在 MySql Hibernate 使用表模拟序列的情况下,这就是您看到 hibernate_sequence 表的原因。 MySql 本身不支持标准序列类型。

    参考文献

    【讨论】:

    • 这是否意味着我需要手动创建 hibernate_sequence 表,或者 Hibernate 应该为我们这样做?
    • 我相信 hibernate 会创建该表 - 假设 DB 用户具有适当的访问权限;应该很容易检查 - 只需启动您的应用程序。
    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多