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.AUTO
hibernate会查找默认hibernate_sequence
表,所以将生成更改 IDENTITY
为如下:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Run Code Online (Sandbox Code Playgroud)
以防万一您从预览启动版本进行迁移:
在您的计算机中设置以下内容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
警告:这将截断应用程序中指定为实体的所有表中的数据
当我遇到表模式和 Java 实体之间的映射不匹配时,我喜欢执行以下操作。
spring.jpa.hibernate.ddl-auto=create
到application.properties现在,这将根据您的实体重新创建架构。然后,如有必要,您可以将创建的表与旧架构进行比较,以查看差异。
如果您使用的是 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.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 仍然可以更好地扩展。
归档时间: |
|
查看次数: |
19708 次 |
最近记录: |