我正在尝试配置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>
答案 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),则应该:
在Spring应用程序上下文xml文件
中通过<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 />
在档案中
您的网络应用的web.xml
应该包含使用xml标记的定义
<persistence-unit-ref>
他的
<persistence-unit-ref-name>
参数应为
persistence/XXX
在persistence.xml中指定的JNDI名称(如上所示)。
最后,您应该在应用程序服务器(依赖于AS)中创建一个JNDI定义,该定义定义JDBC连接的JNDI名称。这个名字应该匹配
persistence.xml文件中的<jta-data-source>
xml标记,它是JPA定义与应用程序服务器中定义的JDBC之间的唯一链接。
收集:
应用程序上下文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>
...
<persistence-unit-ref>
<persistence-unit-ref-name>persistence/XXX</persistence-unit-ref-name>
</persistence-unit-ref>
...
...
@PersistenceContext(name = "YYY")
EntityManager em;
...
jdbc/DSN
链接到连接定义,其中DBM的驱动程序是。取决于AS和使用的DBM。因此,您可能会看到DAO - &gt;之间的连接。 Spring应用程序上下文文件 - &gt; persistence.xml和web.xml文件 - &gt; Application Server JNDI名称。如果您使用的是完整的Java EE应用程序服务器(例如WAS,Weblogic或GlassFish),则不必使用Spring接口模块;只有应用服务器中的定义(参见Spring文档,第12.6.3节)。