Spring DB2 JPA实体管理器问题

时间:2011-01-09 14:31:27

标签: spring jpa db2

我正在尝试配置Spring,JPA和DB2,以便在我的spring控制器中使用实体管理器实例,但根据我如何配置Spring,这不会发生。 这是配置spring的两次尝试:

 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource" />
 <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="em" />
 </bean>
 <bean id="em"
  class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="fileUtility" />
  <property name="jpaVendorAdapter">
   <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
    <property name="database" value="DB2" />
    <property name="showSql" value="true" />
   </bean>
  </property>
 </bean>

第二个是:

  <!-- Entity manager factory bean. -->
  <bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="Sample" />
  </bean>

  <!-- Entity manager bean. -->
  <bean id="em" factory-bean="entityManagerFactory"
    factory-method="createEntityManager" />

并以这种方式注入实体管理器:

<bean id="messageService" class="utilities.services.impl.MessageServiceImpl">
   <property name="entityManager" ref="em" />
  </bean>

但我总是有这个例外:

Caused by: java.lang.IllegalArgumentException: methods with same signature createEntityManager() but incompatible return types: [interface com.ibm.websphere.persistence.WsJpaEntityManager, interface org.apache.openjpa.persistence.OpenJPAEntityManagerSPI]

我不知道如何修复。有人遇到过这个问题吗?

提前致谢。

[编辑] 这是我的persistence.xml:

<?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
    <persistence-unit name="fileUtility"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <mapping-file>META-INF/mapping.xml</mapping-file>
        <properties>
            <property name="openjpa.ConnectionURL" value="jdbc:db2://localhost:50000/db2admin" />
            <property name="openjpa.ConnectionDriverName" value="COM.ibm.db2.jdbc.app.DB2Driver" />
            <property name="openjpa.ConnectionUserName" value="db2admin" />
            <property name="openjpa.ConnectionPassword" value="XXXX" />
            <property name="openjpa.FlushBeforeQueries" value="true"/>
             <property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
         </properties>

    </persistence-unit>

    <persistence-unit name="fileUtility2" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>file_ds</jta-data-source>
        <mapping-file>META-INF/mapping.xml</mapping-file>
        <properties>
            <property name="openjpa.Log" value="SQL=TRACE"/>
            <property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=72"/>
        </properties>
    </persistence-unit>
</persistence>

2 个答案:

答案 0 :(得分:1)

WebSphere捆绑了JPA实现。所以不需要在你的lib中添加openjpa。事实上,WebSphere正在使用OpenJPA,因此您不会丢失任何东西。 Look here了解更多详情

使用jda-data-source时,您需要transaction-type="JTA"。此外,您不应指定连接属性 - 它们在数据源中指定。

摆脱<provider> - 我链接的文件说:

  

如果在EJB模块中的persistence.xml文件的元素中未配置JPA提供程序,则使用当前为此服务器配置的默认JPA提供程序

答案 1 :(得分:1)

我相信你的配置是错误的,因为你正在配置“àcatcat”。如果您正在使用Java EE应用程序服务器(例如WAS),则应该:

  1. 在Spring应用程序上下文xml文件

    • 通过<bean>定义

    • 配置DAO bean
    • 通过
      配置在应用程序服务器中创建的数据源的JNDI定义 <jee:jndi-lookup> 定义;该 name 属性应该是 persistence/XXX,其中XXX应匹配 <persistence-unit name="XXX" transaction-type="JTA"> 在persistence.xml文件中

    • 中的id属性 <jee:jndi-lookup id=YYY>应该指向 DAO中实体管理器定义的name=YYY参数,也就是说, @PersistenceContext(name=YYY) EntityManager em;

    • 指定 <tx:annotation-driven /><tx:jta-transaction-manager />

  2. 在档案中 您的网络应用的web.xml应该包含使用xml标记的定义 <persistence-unit-ref>他的 <persistence-unit-ref-name>参数应为 persistence/XXX在persistence.xml中指定的JNDI名称(如上所示)。

  3. 最后,您应该在应用程序服务器(依赖于AS)中创建一个JNDI定义,该定义定义JDBC连接的JNDI名称。这个名字应该匹配 persistence.xml文件中的<jta-data-source> xml标记,它是JPA定义与应用程序服务器中定义的JDBC之间的唯一链接。

  4. 收集:

    • 应用程序上下文Spring文件
      <bean class=" DAO实施类 " />
      <jee:jndi-lookup id="YYY" jndi-name="persistence/XXX" />
      <tx:annotation-driven />
      <tx:jta-transaction-manager />

    • persistence.xml文件
      <persistence-unit name="XXX" transaction-type="JTA">
      <jta-data-source>jdbc/DSN</jta-data-source>
      </persistence-unit>

    • web.xml文件
      ...
      <persistence-unit-ref>
      <persistence-unit-ref-name>persistence/XXX</persistence-unit-ref-name>
      </persistence-unit-ref>
      ...
    • DAO(仅显示@PersistenceContext)
      ...
      @PersistenceContext(name = "YYY")
      EntityManager em;
      ...
    • Application Server:jdbc/DSN链接到连接定义,其中DBM的驱动程序是。取决于AS和使用的DBM。
  5. 因此,您可能会看到DAO - &gt;之间的连接。 Spring应用程序上下文文件 - &gt; persistence.xml和web.xml文件 - &gt; Application Server JNDI名称。如果您使用的是完整的Java EE应用程序服务器(例如WAS,Weblogic或GlassFish),则不必使用Spring接口模块;只有应用服务器中的定义(参见Spring文档,第12.6.3节)。