【问题标题】:Websphere 7 EAR using OpenJPA 1.0使用 OpenJPA 1.0 的 Websphere 7 EAR
【发布时间】:2012-07-11 13:47:46
【问题描述】:

我们有一个 EAR 应用程序,其中包含一个 WAR、实用程序项目和一个 JPA 项目。 JPA 项目包含我们所有的实体类,在 META-INF 目录中是我们的 persistence.xml,其定义如下:

    <?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">
    <persistence-unit name="TestJPA">
        <description>openjpa</description>
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>jdbc/TestSource</jta-data-source>
        <class>model.TestTable1</class>
        <class>model.TestTable2</class>
    </persistence-unit>
</persistence>

我们的 web.xml 包含以下持久化单元。

  <persistence-unit-ref>
    <persistence-unit-ref-name>peristence/TestJPA</persistence-unit-ref-name>
    <persistence-unit-name>TestJPA</persistence-unit-name>
  </persistence-unit-ref>

在我们的网络服务中,我们有以下内容:

@PersistenceContext(name="peristence/TestJPA", unitName="TestJPA")
private EntityManagerFactory emf;

部署应用程序时,emf 永远不会被实例化。它始终为空。我们也尝试过@PersistenceUnit,有无参数。

我们还尝试了一种不同的方法,即使用 InitialContext 查找来获取 EntityManager。使用这种方法会引发异常,即找不到资源名称。

我们尝试的最后一种方法如下:

em = (EntityManager) Persistence.createEntityManagerFactory("TestJPA");

这会产生以下异常

java.lang.ClassCastException: com.ibm.ws.persistence.EntityManagerFactoryImpl incompatible with javax.persistence.EntityManager

我查找了有关使用 EAR 部署 OpenJPA 的各种教程,但所有这些教程都适用于 JPA 2 或带有 Spring 的 OpenJPA 1。

任何帮助将不胜感激。

【问题讨论】:

  • 检查兼容性。您是否从相互兼容的库中导入。此外,您确定您使用的 EntityManagerFactoryImpl 与您的 EntityManager 兼容吗?.....我在 WAS 中使用外部库时遇到过类似的问题。
  • 我目前正在使用 OpenJPA 插件为 eclipse 添加的库。
  • 我猜您的应用程序包含javax.persistence 类,并且您已将类加载器委托设置为“最后一个父级”。对吗?

标签: java xml jpa openjpa websphere-7


【解决方案1】:

//试试这个

@PersistenceContext(name="TestJPA") 私有 EntityManager em;

我建议深入研究您的 WAS 7 并使用这些库。如果您使用非 ibm 库,甚至 JDK,WAS 就是一场噩梦

【讨论】:

    【解决方案2】:

    在 Web 模块中,您应该使用 PersistenceUnit 而不是 PersistneceContext。尝试以下注入:

    @PersistenceUnit(unitName="TestJPA")
    EntityManagerFactory emf;
    
    ...
    EntityManager em = emf.createEntityManager();
    ...
    em.close();
    

    另外,您使用的是哪种网络服务?如果您使用的是第三方 WS 引擎,注释集成可能不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2015-08-02
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多