我有一个使用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的任何缺点。
答案 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)
当我遇到表模式与Java实体之间的映射不匹配时,我喜欢执行以下操作。
spring.jpa.hibernate.ddl-auto=create
属性添加到 application.properties 现在,这将根据您的实体重新创建架构。然后,可以根据需要将创建的表与旧模式进行比较,以查看区别。
警告:这将截断指定为应用程序中实体的所有表中的数据
答案 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.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
解决了问题