Hibernate作为WebSphere 7上的JPA 2.0 Provider

时间:2012-06-08 15:40:08

标签: hibernate jpa-2.0 websphere-7

我们正在尝试将Hibernate用作WebSphere Application Server 7.0上的JPA Provider。但我们正在接受例外。

  

javax.ejb.EJBException:注入失败;嵌套异常是:

     

java.lang.IllegalStateException:EntityManagerFactory还没有   为PU创建:PuId = data_commonweb #data_ejb_common.jar #data_common

     

引起:java.lang.IllegalStateException:EntityManagerFactory有   没有为PU创建:   PUID = data_commonweb#data_ejb_common.jar#data_common

Persistense.xml如下:

    

    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/db_ds</jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialet"/>
        <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>
        <property name="openjpa.TransactionMode" value="managed"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
    </properties>
</persistence-unit>

2 个答案:

答案 0 :(得分:1)

经过认真的研究后,我发现了一个变化:

http://forum.spring.io/forum/spring-projects/data/115284-jpa2-with-spring-data-deployed-on-websphere-7-without-websphere-jpa2-feature-pack

JPA2,在没有Websphere JPA2功能包的情况下,在Websphere 7上部署了spring-data 2012年3月22日,下午08:52 经过一天的研究,终于找到了使用Webphere 7或更低版​​本运行JPA 2的方法,而无需安装Websphere JPA2功能包。

默认情况下,Websphere 7支持JPA1,但在尝试运行JPA2时会产生类加载器问题,而且Websphere始终没有任何明确的解决此限制的文档。 以下是一个非常简单的解决方案:

  1. Persistence.xml文件FIX
  2. 解决此问题的两种方法:

    • 摆脱persistence.xml文件。或
    • 将persistence.xml重命名为persistence_WAS.xml

    示例代码 代码:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceXmlLocation" value="classpath:META-INF/persistence_WAS.xml"/>
    </bean>
    

    这是因为J2EE容器默认在META-INF / web应用程序下查找persistence.xml并保持这将导致websphere7初始化JPA1而忽略使用JPA2的请求。 通过使用Spring Data配置,摆脱persistence.xml是我的选择。 (XML版本属性的抛出验证异常无效)

    1. 手动初始化持久性管理器(删除对Websphere的依赖性) Spring提供了LocalContainerEntityManagerFactoryBean来创建持久性管理器。
    2. (或使用JPA API初始化您自己的Persistence Manager)

      在PersistentUnitInfo中传递您需要的值。

      1. 将XML Parsing Jars添加到应用程序库
      2. 这是因为一旦我们将Websphere的类加载器策略更改为父级,它就无法初始化XML解析库

        以下是完整列表:

        • 的Xalan-2.7.jar
        • xbean-2.2.0.jar
        • xbean_xpath-2.2.0.jar
        • xercesImpl-2.6.2.jar
        • XML的API-2.8.jar
        • xmlpublic-2.2.0.jar
        • XMLSchema的1.4.7.jar
        • xpp3-1.1.3.4.O.jar
        • 的XStream-1.2.1.jar

          1. 更改Websphere应用程序服务器上的类加载器策略

        在从WAR或EAR文件加载所有JAR之后,让Websphere最终加载其内部和扩展JAR - PARENT_LAST可以解决这个问题。

        以下是更新path步骤

        的路径

        Applications > Application Types > WebSphere enterprise applications

        选择已部署的应用程序:

        Enterprise Applications > JPA2-Application > Manage Modules

        选择WAR文件,例如。 JPA2-Application.war

        将类加载器顺序设置更改为首先加载本地类加载器的类(父类最后一个) 在类加载器查看器下,您可以看到您的ClassLoader - 搜索顺序 - 您可以看到您的EAR中的Jars和类首先被加载。

        在我的情况下,不需要额外的库(步骤3)

答案 1 :(得分:-2)