在带有spring/hibernate的Websphere上使用jpa2.2



我最近继承了一个Spring/HHibernate应用程序,并将其升级为Spring 5.2.8SpringSecurity 5.3.4Hibernate 5.4.21

我们部署在Websphere 8.5.5上(完全,而非自由(。

当我尝试运行应用程序时,我会遇到一个异常,我认为相关部分是:

。。。嵌套异常为org.springframework.beans.factory.BeanCreationException:创建ServletContext资源[/WEB-INF/applicationContext hibernate.xml]中定义的名称为"auditSessionFactory"的bean时出错:调用init方法失败;嵌套异常为java.lang.NoSuchMethodError:javax/persistence/JoinColumn.foreignKey((Ljavax/persistice/foreignKey;(由以下文件加载:/C:/Program Files(x86(/IBM/WebSphere/AppServer/plugins/javax.j2ee.persistence.jarorg.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@2472a612)从类org.hibernate.cfg.AnnotationBinder(从文件/C:/Program%20Files%20(x86(/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/Node01Cell/nameof_war.ear/nameof.war/WEB-INF/lib/hibernate-core-5.421.Final.jar加载(com.ibm.ws.classloader.CompoundClassLoader@71ed602b[war:nameof_war/nameof.war]

我注意到它使用的是JPA的Websphere版本,而不是我在战争中包含在jar中的版本。Websphere附带了javax.j2ee.persistence.jar-JPA版本2.0,它解释了这个错误。

另一个SO问题的答案让我来到了这里:https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/tejb_jpa3rdparty.html

此链接试图解释如何使用第三方持久性提供程序。

问题是,链接说要使用persistence.xml;但是我继承的应用程序没有那个xml文件。它只有applicationContext-hibernate.xml和orm.xml。

我已经尝试创建一个persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="nameof">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jar-file>nameof.jar</jar-file>
</persistence-unit>
</persistence>

它出现在WAR文件的正确位置;但我不知道这是否正确,也不知道我是否也必须更新任何其他文件?我需要在其他地方引用那个持久性单元吗?

我还更新了WebSphere中的类加载器,使其成为最后一个父类;但是我仍然得到如上所示的错误。

我错过了哪些步骤?我需要在applicationContext-hibernate.xml(或其他地方(中做什么更改才能使其工作?

我的applicationContext-hibernate.xml看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="auditSessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>com.name.class1</value>
<value>com.name.class2</value>
<value>etc</value>
</list>
</property> 
<property name="mappingResources">
<list>
<value>com/name/model/orm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</prop>
<prop key="hibernate.jdbc.fetch_size">100</prop>
</props>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>com.name.class3</value>
<value>com.name.class4</value>
<value>etc</value>
</list>
</property> 
<property name="mappingResources">
<list>
<value>com/name/model/orm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</prop>
<prop key="hibernate.jdbc.fetch_size">100</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.order_inserts">true</prop>  
<prop key="hibernate.order_updates">true</prop> 
<prop key="hibernate.jdbc.batch_size">100</prop>
</props>
</property>
<property name="entityInterceptor">
<bean class="com.name.interceptor.HibernateInterceptor">
<property name="auditInterceptor">
<bean class="com.name.interceptor.AuditInterceptor" />
</property>
<property name="comparativeAuditInterceptor">
<bean class="com.name.interceptor.ComparativeAuditInterceptor">
<property name="cadDao">
<bean class="com.name.dao.ComparativeAuditDetailsDaoImpl">
<property name="sessionFactory" ref="auditSessionFactory" />
</bean>
</property>
<property name="undoDao">
<bean class="com.name.dao.UndoDaoImpl">
<property name="sessionFactory" ref="auditSessionFactory" />
</bean>
</property>
</bean>
</property>
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate5.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="transactionInterceptor" class="com.name.TransactionalWebRequestInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttribute" value="PROPAGATION_REQUIRES_NEW"/>
</bean>
</beans>

最终帮助我的是以下帖子:https://medium.com/@james.tran/how-deploy-spring-bot-2-x-apps-on-websphere-85-5-d0b2e257f606

具体来说,以下步骤:

在管理控制台中,单击"应用程序">应用程序类型>WebSphere企业应用程序>应用程序名称>管理模块>webmodule_name。

从下拉列表中选择首先使用本地类加载器加载的类(最后选择父类(。

我已经在控制台的其他地方做过了,但不是在这里。

此外,我还尝试了以下操作:

https://www.ibm.com/support/pages/apar/PM26361

  1. 打开管理控制台
  2. 选择服务器->服务器类型->WebSphere应用程序服务器
  3. 选择要配置的服务器
  4. 在"服务器基础结构"区域中,选择"Java and Process Management"->流程定义
  5. 在"服务器基础结构"区域中,选择"进程定义">
  6. 在Additional Properties(其他属性(区域中,选择Java Virtual Machine(Java虚拟机(
  7. 在"其他特性"区域中,选择"自定义特性">
  8. 选择"新建"框
  9. 在Name条目字段中,键入:com.ibm.websphere.persistence.ApplicationsExcludedFromJpaProcessing
  10. 在Value entry字段中,键入要从JPA处理中排除的应用程序的名称。如果存在多个应用程序用":"性格如果要指定所有应用程序只需键入"*"性格
  11. 选择"确定">
  12. 重新启动服务器

我不知道哪些步骤有帮助——如果有机会,我会尽量缩小范围并报告。

相关内容

  • 没有找到相关文章

最新更新