【问题标题】:Table 'DBNAME.hibernate_sequence' doesn't exist表 'DBNAME.hibernate_sequence' 不存在
【发布时间】:2018-09-23 14:48:24
【问题描述】:

我有一个使用 spring data / jpa 的 SpringBoot 2.0.1.RELEASE 应用程序

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

但是当我在 Amazon Aurora 数据库中进行更新时,我收到了这个错误:

2018-04-13 09:20 [pool-1-thread-1] 错误 o.h.id.enhanced.TableStructure.execute(148) - 无法读取 hi 值 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)中不存在表“elbar.hibernate_sequence”

我在要保存的实体中有这个

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

我也想避免在数据库中获取 ID 的任何缺点。

【问题讨论】:

    标签: java mysql spring spring-boot spring-data


    【解决方案1】:

    只需将此代码添加到您的 application.properties 文件中

    spring.jpa.hibernate.ddl-auto=update
    

    【讨论】:

      【解决方案2】:

      您可以只创建表:

      create table hibernate_sequence(
          next_val INTEGER NOT null
      );
      

      【讨论】:

        【解决方案3】:

        在propoerties 文件中添加spring.jpa.hibernate.ddl-auto=create 解决了这个问题

        【讨论】:

          【解决方案4】:

          以防万一您从以前的引导版本迁移:

          application.yml 中设置以下内容将阻止 hibernate 查找 hibernate_sequence 条目。

          spring.jpa.hibernate.use-new-id-generator-mappings
          

          这是 Boot 1.x 中的默认设置

          【讨论】:

            【解决方案5】:

            如果您使用的是 Hibernate5 之前的 Hibernate 版本,@GeneratedValue(strategy = GenerationType.IDENTITY) 就像一个魅力。但是发布 Hibernate5 后,需要进行以下修复。

            @Id
            @GeneratedValue(strategy= GenerationType.AUTO,generator="native")
            @GenericGenerator(name = "native",strategy = "native")
            private Long id;
            

            DDL

            `id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
            

            原因

            摘自hibernate-issue

            目前,如果 hibernate.id.new_generator_mappings 设置为 false, @GeneratedValue(strategy = GenerationType.AUTO) 映射到本机。 如果此属性为真(这是 5.x 中的默认值),则 @GeneratedValue(strategy = GenerationType.AUTO) 始终映射到 序列样式生成器。

            因此,在任何不支持序列的数据库上 本机(例如 MySQL)我们将使用 TABLE 生成器 身份。

            然而,TABLE 生成器虽然更便携,但使用单独的 每次从数据库中获取值时的事务。在 事实上,即使 IDENTITY 禁用 JDBC 批量更新和 TABLE 生成器使用池化优化器,IDENTITY 仍然可以更好地扩展。

            【讨论】:

              【解决方案6】:

              JPA 和 Auto-DDL

              当我遇到表架构和 java 实体之间的映射不匹配时,我喜欢执行以下操作。

              1. 删除架构
              2. spring.jpa.hibernate.ddl-auto=create 属性添加到application.properties
              3. 重新启动您的应用程序

              现在这将根据您的实体重新创建架构。然后,如有必要,您可以将创建的表与旧架构进行比较以查看差异。

              警告:这将截断应用程序中指定为实体的所有表中的数据

              【讨论】:

                【解决方案7】:

                在您的 application.yml 中添加以下配置:

                spring: jpa: hibernate: use-new-id-generator-mappings: false

                或者如果你使用 application.properties 这个

                spring.jpa.hibernate.use-new-id-generator-mappings= false

                【讨论】:

                  【解决方案8】:

                  随着 GenerationType.AUTO 的生成,hibernate 将寻找默认的 hibernate_sequence 表,因此将生成更改为 IDENTITY,如下所示:

                   @Id
                   @GeneratedValue(strategy = GenerationType.IDENTITY)
                   private Long id;
                  

                  【讨论】:

                  • vladmihalcea.com/… 清楚地解释了 Hibernate 3 和 5 主要版本在处理 GenerationType.AUTO 上的变化
                  • @SudhirR thnx 很棒的文章 :)
                  猜你喜欢
                  • 2021-11-07
                  • 2015-08-30
                  • 2014-02-03
                  • 2018-09-17
                  • 1970-01-01
                  • 2019-11-11
                  • 2011-09-06
                  • 2018-08-05
                  • 2015-02-19
                  相关资源
                  最近更新 更多