版本环境:spring boot (1.5.9.Release)
pom.xml文件:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>${oracle.ojdbc6.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies>
错误信息:
Caused by: java.lang.ClassNotFoundException: org.hibernate.OptimisticLockException at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_144] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_144] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_144] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_144] ... 60 common frames omitted
错误原因:
在spring boot为1.5.9.RELEASE版本下,默认引入的spring-boot-starter-data-jpa的版本是1.5.9.RELEASE,而其中包含的hibernate核心依赖hibernate-core版本为5.0.12.Final,在该版本中移除了OptimisticLockException类,所以产生上面的错误。
解决方案:
经查询,在hibernate-core版本为5.0.11.Final依赖中存在该类,所以移除默认依赖的版本,添加该版本即可,修改后的pom.xml如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>${oracle.ojdbc6.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <!--消除hibernate-core 5.0.12.Final的依赖--> <exclusion> <artifactId>hibernate-core</artifactId> <groupId>org.hibernate</groupId> </exclusion> </exclusions> </dependency> <!--添加hibernate-core 5.0.11.Final依赖,原因:5.0.12版本里面缺少OptimisticLockException类--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.11.Final</version> </dependency> </dependencies>
备注:该解决方式只是建议解决方案,由于在高版本的5.0.12.Final中移除了该类,但官方肯定通过其他方式实现相应的操作,作者目前还不清楚。