注意:我的项目环境是spring-boot + spring-data-jpa + mysql , 如果你使用的是oracle数据库,则不要使用此方法,直接增加一个名字hibernate_sequence
的sequence就好了 !!!
一. 问题描述
- 项目使用Spring-data-JPA , 使用的msyql数据库(主键是自增autoincrement),实体类中的主键使用的是
@GeneratedValue(strategy = GenerationType.AUTO)
,预期效果应该是不报错的,结果在运行中报了异常。 - 实体id注解
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
二. 部分异常错误如下:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'access_log.hibernate_sequence' doesn't exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_121]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_121]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-2.7.8.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-2.7.8.jar:na]
三. 原因分析
- 实体类使用了
@GeneratedValue(strategy = GenerationType.AUTO)
注解,以上异常在mysql中是不应该出现的,如果是在oracle 则正常。 - 原因是我的项目中升级了spring-boot ,原来是1.x升级到了2.x , jpa 中的hibernate也跟着从4.x升级到了5.x , 其中有一个默认配置在hibernate4中是
hibernate.id.new_generator_mappings=false
。在hibernate5中是hibernate.id.new_generator_mappings=true
, 所要做的就是把这个配置改成false就好了。
四. 解决方法
- 在spring-boot中配置如下
spring:
jpa:
hibernate:
use-new-id-generator-mappings: false
网友评论