SpringBoot2.0常见问题
SpringBoot2.0后常见问题
最近在自学SpringBoot2(目前版本为2.0.3.RELEASE),在学习前人代码和视频时,发现一些代码无效,自己通过百度、谷歌获得解决方案,此处作为记录,以后会持续补充。
spring boot Configuration Annotation Proessor not found in classpath
根据提示的not found in classpath,查询此注解的使用关于怎么指定classpath,进而查询location,spring boot1.5以上版本@ConfigurationProperties取消location注解
解决方案
在pom.xml中加入
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
@GeneratedValue自增长无效
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键),@GeneratedValue提供了主键的生成策略。@GeneratedValue注解有两个属性,分别是strategy和generator,其中generator属性的值是一个字符串,默认为”“,其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。
自增长无效解决方案
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Transactional回滚无效
Service层报错时,事物仍然进行了提交。通过查找各方资料。大致原因归纳为一下几种:
1、检查你方法是不是public的
2、你的异常类型是不是unchecked异常
如果我想check异常也想回滚怎么办,注解上面写明异常类型即可
@Transactional(rollbackFor=Exception.class)
类似的还有norollbackFor,自定义不回滚的异常
3、数据库引擎要支持事务,如果是MySQL,注意表要使用支持事务的引擎,比如innodb,如果是MyISAM,事务是不起作用的。
我的主要是第三种原因造成的。
Spring Boot 2.0使用data Jpa时。创建表默认使用的是MyISAM引擎,但是Mysql MyISAM引擎是不支持事务的。所以把数据库的表改为innodb 引擎就行了。
————————— 不想一个个改表的存储结构?继续往下看—————
但是,有没有一劳永逸的方法呢?
有的!
Spring Boot 2.0.3.RELEASE 使用的Jpa 版本是2.0.3.RELEASE
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
这个版本的JPA使用的是hibernate 5.2.17
在这个版本中 之前一直使用的方言被废弃了 MySQL5InnoDBDialect 已经被废弃了。MySQL5InnoDBDialect 主要适用于MySQL5.5版本,5.5之后的版本,hibernate给出了其他的解决方案,MySQL55Dialect 和 MySQL55Dialect ()
所以5.5以后的版本根据mysql的版本,需要采用合适的方言。例如,我是用的mysql5.6的所以就最后使用 MySQL5InnoDBDialec
所以修改spring jpa配置如下 我使用的是yml
jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
这里就不需要配置 hibernate 的dialect 了
把之前的表删掉,重启看一下吧,现在创建的表都是innoDB引擎了。并且@Transactional 再报错,事务也可以回滚了。\
@ControllerAdvice无效
改用@RestControllerAdvice即可
上一篇: 掌握MySQL SELECT语句窍门
下一篇: 设置 MySql 数据同步