在尝试升级我们的应用程序以使用 Spring Boot 2.1.0 时,我在 Hibernate 初始化时遇到了一个问题。我们目前使用 Hibernate 5.2.x,据我所知 Spring Boot 2.1.0 应该仍然支持这个版本。但是,在 Spring Boot JPA 自动配置期间似乎对 Hibernate 5.3.x 存在显式依赖。在 Hibernate 5.2.x 中,当HibernateJpaConfiguration
类执行引导 Hibernate 时,ClassNotFoundException
会抛出 a 错误,因为它无法找到 Hibernate 5.3.x 的新类 BeanContainer。
Caused by: java.lang.ClassNotFoundException: org.hibernate.resource.beans.container.spi.BeanContainer
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 45 common frames omitted
问题看起来出在HibernateJpaConfiguration.determineHibernatePropertiesCustomizers
实例化SpringBeanContainer
.
我附上了一个从 Spring Initializr 生成的超级简单项目来演示该问题。我在创建项目后所做的唯一更改是将属性设置hibernate.version
为5.2.17.Final
.只需运行 Maven 构建或启动应用程序即可查看问题。
查看源代码后,在初始化期间似乎没有条件检查来确定该类是否BeanContainer
可用。我认为我们需要类似的东西LocalSessionFactoryBean
@Override
public void setBeanFactory(BeanFactory beanFactory) {
if (beanFactory instanceof ConfigurableListableBeanFactory &&
ClassUtils.isPresent("org.hibernate.resource.beans.container.spi.BeanContainer",
getClass().getClassLoader())) {
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
}
spring-boot-hibernate-problem-demo.zip