表'DBNAME.hibernate_sequence'不存在

en *_*ris 20 java mysql spring spring-data spring-boot

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

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

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
Run Code Online (Sandbox Code Playgroud)

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

Spr*_*r F 48

随着生成 GenerationType.AUTOhibernate会查找默认hibernate_sequence表,所以将生成更改 IDENTITY 为如下:

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;
Run Code Online (Sandbox Code Playgroud)

  • https://vladmihalcea.com/why-should-not-use-the-auto-jpa-generationtype-with-mysql-and-hibernate/清楚地说明了在Generation3上处理Hibernate 3和5主要版本之间的变化 (2认同)
  • @SudhirR thnx 很棒的文章:) (2认同)

Lau*_*res 7

以防万一您从预览启动版本进行迁移:

在您的计算机中设置以下内容application.yml将防止休眠状态查找hibernate_sequence条目。

spring.jpa.hibernate.use-new-id-generator-mappings
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

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

或者如果使用application.properties

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


Chr*_*lli 6

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

JPA 和自动 DDL

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

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

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


Pra*_*ran 6

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

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

数据线

`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
Run Code Online (Sandbox Code Playgroud)

原因

摘自hibernate-issue

目前,如果 hibernate.id.new_generator_mappings 设置为 false,@GeneratedValue(strategy = GenerationType.AUTO) 将映射到 native。如果此属性为 true(这是 5.x 中的默认值),则 @GeneratedValue(strategy = GenerationType.AUTO) 始终映射到 SequenceStyleGenerator。

出于这个原因,在任何本身不支持序列的数据库(例如 MySQL)上,我们将使用 TABLE 生成器而不是 IDENTITY。

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