2012-06-08 29 views
4

我们试图在WebSphere Application Server 7.0上将Hibernate用作JPA提供程序。但是我们正在接受例外。Hibernate作为WebSphere 7上的JPA 2.0提供程序

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> 

+0

这看起来像一个内部错误。在出现错误之前,SystemOut.log中是否存在其他错误可能是原因? –

回答

-2
+1

另请参阅IBM JPA论坛https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000001843和IBM Developerworks Wiki。 https://www.ibm。com/developerworks/community/wikis/home?lang = en –

+1

请不要只发布链接的答案。如果链接包含答案,请在StackOverflow的答案中放入答案的相关部分。如果链接后面的内容发生变化,或内容被删除,您的答案不再回答这个问题。 – Sumurai8

+1

@DavidVictor感谢您的编辑btw;我不知道为什么人们拒绝你的编辑,但我现在做了个人头衔。 – Sumurai8

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 7 WITHOUT的Websphere JPA2功能包 2012年3月22日春季数据,下午8点52 研究为后一天,终于想出了使用Webphere 7或以下版本运行JPA 2的方式,而无需安装Websphere JPA2功能包。

的Websphere 7默认支持JPA1但试图运行时JPA2和一如既往的Websphere没有解决此限制的任何明确的文档创建的类加载器的问题。 这里是一个非常简单的解决方案,工作围绕此:

  1. persistence.xml文件FIX

两种方式解决此问题:

  • 摆脱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容器查找persistence.xml中根据META-INF /的Web应用程序并保持这将导致websphere7初始化JPA1忽略使用JPA2的请求。 通过使用Spring Data配置,摆脱persistence.xml是我的一个选择。 (XML版本属性的抛出验证异常是无效的)

  • 手册初始化持久化管理器(除去在WebSphere依赖) LocalContainerEntityManagerFactoryBean由Spring提供创建持久性管理器。
  • (或初始化使用JPA API创建自己的持久性管理器)

    转至PersistentUnitInfo你所需的值。

  • 添加XML解析瓶给你的应用程序的lib
  • 这是因为一旦我们改变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

    • 更改类加载器WebSphere Application Server上政策

    使Websphere在从WAR或EAR文件加载所有JAR后最终加载其内部和扩展JAR - PARENT_LAST在这里执行操作。

    这里是更新步骤

    Applications > Application Types > WebSphere enterprise applications

    选择部署的应用程序路径:

    Enterprise Applications > JPA2-Application > Manage Modules

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

    更改类加载器顺序设置加载本地类加载器第一(父最后一) 在类装入器查看器,你可以看到你的ClassLoader类 - 搜索顺序 - 你可以看到你的EAR的JAR和类首先加载。

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

    +0

    请不要只发布链接的答案。如果链接后面的内容发生变化或内容被删除,您的答案不再回答这个问题 – prajmus

    +0

    很好的答案!这非常有帮助! –

    相关问题