Websphere 8.5和JPA 2.1

voase2hg  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(145)

IBM曾经有一个功能包将JPA 2.0放入WAS 7中。WAS 8.5.5显然附带了JPA 2.0。但是我们有一个应用程序,我们刚刚升级到Hibernate 4,它需要JPA 2.1。我找不到WAS 8.5特性包的链接,无法将其推送到JPA 2.1。
有没有人在WAS 8.5中使用Hibernate 4?如果是,如何进行?如果没有特性包,我们会在javax.persistence类上得到NoSuchMethodError。

pw136qt2

pw136qt21#

Hibernate4.3.7.Final可以在Websphere Application Server8.5.5中使用,配置如下:

  • hibernate-jpa-2.1.jar打包到应用程序中,并将类加载器策略设置为PANLOAD_LAST。

Hibernate 4.3.7.Final与WebSphere 8.5.5提供的JPA 2.0 API不兼容

如果不这样做,您将在启动期间得到以下SAXParseException,因为WebSphere试图根据JPA 2.0模式解析persistence.xml。

Caused by: org.xml.sax.SAXParseException: expected root element {http://java.sun.com/xml/ns/persistence}persistence
        at com.ibm.ws.jpa.management.JaxbUnmarshaller.startElement(JaxbUnmarshaller.java:310)
  • 在您的应用程序中应用JPA-4问题的解决方法。

该问题是在使用 Hibernate的JPA 2 API而不是Webspheres JPA 1 API 时报告的,而解决方法也适用于Hibernate的JPA 2.1 API,但有一些微小的更改:
您需要将HibernatePersistence替换为HibernatePersistenceProvider,因为前者已被弃用。
如果不这样做,您将在启动过程中得到以下ClassCastException,因为Hibernate的JPA 2.1 API将加载所有PersistenceProvider类,包括在类路径中公开的WebSphere类。

Caused by: java.lang.ClassCastException: com.ibm.websphere.persistence.PersistenceProviderImpl incompatible with javax.persistence.spi.PersistenceProvider
        at javax.persistence.Persistence$1.isLoaded(Persistence.java:110)
        at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:56)
rbpvctlc

rbpvctlc2#

Hibernate 4.2.x实现了JPA 2.0规范,我们在WebSphere 8.5.5中使用它没有任何问题。我们将Hibernate JAR打包到我们的WAR中,并将persistence.xml中的provider属性设置为org.hibernate.ejb.HibernatePersistence。
只有Hibernate 4.3.x需要JPA 2.1,并且不适用于WebSphere 8.5.5。

e4yzc0pl

e4yzc0pl3#

我可以使用运行在Java 8上的websphere8.5.5.13来实现这一点,方法是创建一个共享库,其中包含

*hibernate-jpa-2.1-API-1.0.2.Final.jar
*hibernate-core-4.3.11.Final.jar

一切都很顺利

2wnc66cl

2wnc66cl4#

我能够在WebSphere 8.5上运行JPA 2.1,如下所示:
1-使应用程序类从websphere控制台最后装入父类
2-添加LocalContainerFactoryManagerFactoryBean如下:

@Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
            DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean em = builder.dataSource(dataSource).packages("com.myapp")
                .properties(jpaProperties()).build();
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }

    protected Map<String, Object> jpaProperties() {
        Map<String, Object> props = new HashMap<>();
        props.put("hibernate.physical_naming_strategy", CamelCaseToUnderscoresNamingStrategy.class.getName());
        props.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        return props;
    }
exdqitrt

exdqitrt5#

在WebSphere中使用自己的持久性提供程序应该没有问题。我的建议是在应用中打包一个JPA 2.1提供程序,并尝试将类加载器更改为最后的父类。在这种情况下,您不会使用WebSphere提供的默认OpenJPA 2.0。您将使用您选择的供应商。
http://www-01.ibm.com/support/knowledgecenter/api/content/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/tejb_jpa3rdparty.html
http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/trun_classload_server.html?cp=SSAW57_8.5.5%2F3-8-2-5-1&lang=en
希望这对你有帮助。
来自IBM支持门户的另一篇相关文章:http://www-01.ibm.com/support/docview.wss?uid=swg21672354

相关问题