Spring Boot 2.0.4 和 WAS Liberty 事务 18.0.0.2 事务管理器问题
Spring Boot 2.0.4 and WAS Liberty transaction 18.0.0.2 Transaction manager issue
我是 WAS Liberty 的新手,正在尝试部署 spring 引导应用程序。
服务器在启动时抛出异常。
[AVERTISSEMENT] 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名称为 'entityManagerFactory' 的 bean 在 class 路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration 中定义时出错。 class]: init方法调用失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] 无法构建 Hibernate SessionFactory;嵌套异常是 java.lang.UnsupportedOperationException
问题是 Hibernate 试图用错误的事务管理器调用挂起 class:
原因:java.lang.UnsupportedOperationException 在 org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.suspend(WebSphereExtendedJtaPlatform.java:131)
此 class 由 Spring 在 class HibernateJpaConfiguration 中启动配置,其中不包括正确的事务管理器:
私有静态最终字符串[] WEBSPHERE_JTA_PLATFORM_CLASSES = {
"org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform",
"org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" };
当我将 class 更改为 org.hibernate.engine.transaction.jta.platform.internal.WebSphereLibertyJtaPlatform 时,应用程序启动。这是配置问题还是 spring 引导不支持 WAS Liberty。
感谢您的帮助。
根据这个问题,WebSphereLibertyJtaPlatform
从版本 5.2.13 和 5.3.Beta2 开始引入 Hibernate:https://hibernate.atlassian.net/browse/HHH-11571
如果您使用的 Hibernate 版本包含 WebSphereLibertyJtaPlatform
且 JTA 平台 class 属性 未明确设置,则将自动检测并使用 Liberty 平台.
据我了解,Spring Boot 2.0.4 及其默认的 Hibernate 版本 (5.2.17) 支持 Liberty。然而,问题是,如 Spring Boot issue #8926 中所述,Spring Boot 2.0.4 覆盖了 Websphere Liberty JTA 实现,否则将由 Hibernate 正确设置。
出于各种原因,我坚持使用 Liberty 16.0.0.4 和 Spring Boot 2.0.4,需要找到一种方法来设置正确的 Websphere Liberty JTA 实现。我最终使用 HibernatePropertiesCustomizer
bean 覆盖了 hibernate.transaction.jta.platform
属性
@Bean
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {
return hibernateProperties ->
hibernateProperties.put("hibernate.transaction.jta.platform",
"org.hibernate.engine.transaction.jta.platform.internal.WebSphereLibertyJtaPlatform");
}
我是 WAS Liberty 的新手,正在尝试部署 spring 引导应用程序。 服务器在启动时抛出异常。
[AVERTISSEMENT] 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名称为 'entityManagerFactory' 的 bean 在 class 路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration 中定义时出错。 class]: init方法调用失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] 无法构建 Hibernate SessionFactory;嵌套异常是 java.lang.UnsupportedOperationException
问题是 Hibernate 试图用错误的事务管理器调用挂起 class: 原因:java.lang.UnsupportedOperationException 在 org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.suspend(WebSphereExtendedJtaPlatform.java:131)
此 class 由 Spring 在 class HibernateJpaConfiguration 中启动配置,其中不包括正确的事务管理器:
私有静态最终字符串[] WEBSPHERE_JTA_PLATFORM_CLASSES = { "org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform", "org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" };
当我将 class 更改为 org.hibernate.engine.transaction.jta.platform.internal.WebSphereLibertyJtaPlatform 时,应用程序启动。这是配置问题还是 spring 引导不支持 WAS Liberty。
感谢您的帮助。
根据这个问题,WebSphereLibertyJtaPlatform
从版本 5.2.13 和 5.3.Beta2 开始引入 Hibernate:https://hibernate.atlassian.net/browse/HHH-11571
如果您使用的 Hibernate 版本包含 WebSphereLibertyJtaPlatform
且 JTA 平台 class 属性 未明确设置,则将自动检测并使用 Liberty 平台.
据我了解,Spring Boot 2.0.4 及其默认的 Hibernate 版本 (5.2.17) 支持 Liberty。然而,问题是,如 Spring Boot issue #8926 中所述,Spring Boot 2.0.4 覆盖了 Websphere Liberty JTA 实现,否则将由 Hibernate 正确设置。
出于各种原因,我坚持使用 Liberty 16.0.0.4 和 Spring Boot 2.0.4,需要找到一种方法来设置正确的 Websphere Liberty JTA 实现。我最终使用 HibernatePropertiesCustomizer
bean 覆盖了 hibernate.transaction.jta.platform
属性
@Bean
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {
return hibernateProperties ->
hibernateProperties.put("hibernate.transaction.jta.platform",
"org.hibernate.engine.transaction.jta.platform.internal.WebSphereLibertyJtaPlatform");
}