表' DBNAME.hibernate_sequence'不存在

时间:2018-04-13 09:29:51

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

我有一个使用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] ERROR o.h.id.enhanced.TableStructure.execute(148) - 无法读取hi值   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表&#39; elbar.hibernate_sequence&#39;不存在于sun.reflect.NativeConstructorAccessorImpl.newInstance0(原生方法)

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

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

我还想避免在DB中获取ID的任何缺点。

6 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:4)

以防您从预览启动版本迁移:

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

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

这是Boot 1.x中的默认值

答案 2 :(得分:1)

JPA和Auto-DDL

当我遇到表模式与Java实体之间的映射不匹配时,我喜欢执行以下操作。

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

现在,这将根据您的实体重新创建架构。然后,可以根据需要将创建的表与旧模式进行比较,以查看区别。

  

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

答案 3 :(得分:0)

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

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

或者如果您使用application.properties,则此

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

答案 4 :(得分:0)

如果您使用的是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)映射到本机。   如果此属性为true(这是5.x中的defult值),则   @GeneratedValue(strategy = GenerationType.AUTO)始终映射到   SequenceStyleGenerator。

     

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

     

但是,TABLE生成器虽然更便于移植,但使用了单独的   每次从数据库中获取值时进行事务处理。在   实际上,即使IDENTITY禁用JDBC批处理更新和TABLE,   生成器使用池优化器,IDENTITY的伸缩性仍然更好。

答案 5 :(得分:0)

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