2011-01-09 3 views
0

스프링 컨트롤러에서 엔티티 관리자 인스턴스를 사용하기 위해 스프링, JPA 및 DB2를 구성하려고하지만 스프링 구성 방법에 따라이 작업이 수행되지 않습니다. 이 스프링 구성의 두 시도이다 :스프링 DB2 JPA 엔티티 관리자 문제

<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] 

어떻게 고칠 수 있는지 모르겠습니다. 누구든지이 문제가 발생 했습니까?

미리 감사드립니다.

<?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> 

답변

1

WebSphere를 번들 JPA 구현이 있습니다

[편집] 이 내의 persistence.xml이다. 따라서 lib에 openjpa를 추가 할 필요가 없습니다. 실제로 WebSphere는 OpenJPA를 사용하므로 아무 것도 잃지 않습니다. Look here 자세한 내용은

jda-data-source을 사용하는 경우 transaction-type="JTA"이 필요합니다. 또한 연결 속성을 지정하면 안됩니다. 연결 속성은 데이터 소스에 지정됩니다.

그리고 <provider> 제거 - 내가 링크 된 문서는 말한다 : 더 JPA 제공자는 EJB 모듈 내에서 persistence.xml 파일의 요소에 구성되지

경우, 현재 기본 JPA 제공 이 서버에 맞게 구성되었습니다.

+0

예, 맞습니다. 그러나 구성 정보 db2와 jpa를 함께 사용하기위한 절차를 찾을 수있는 자습서를 알고 있습니까? 이 정보는 IBM 웹 사이트에서 찾을 수 없습니다. – carlo

+0

하지만 제 질문은 JPA와 DB2에서 작동하도록 Spring을 구성하는 방법입니다. – carlo

+0

@carlo - persistence.xml을 보여 줌 – Bozho

1

"Tomcat"으로 구성했기 때문에 잘못된 구성을 수행하고 있다고 생각합니다. 당신은 자바 EE 애플리케이션 서버를 사용하는 경우, WAS와 같은, 당신이해야 :

스프링 애플리케이션 컨텍스트 XML 파일에
    • 를 구성한다 <bean> 정의로 DAO 콩


    • <jee:jndi-lookup>정의를 통해 응용 프로그램 서버에서 생성 된 데이터 소스에 대한 JNDI 정의를 구성합니다. name 속성은 persistence/XXX이어야합니다. 여기서 XXX는 지속성에서 <persistence-unit name="XXX" transaction-type="JTA">와 일치해야합니다.XML 파일은 <jee:jndi-lookup id=YYY>의 id 속성은 DAO의 엔티티 관리자 정의의 name=YYY 매개 변수를 표시해야한다

    • 는,이 말을하는 것입니다

      , @PersistenceContext(name=YYY) EntityManager em;

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

    • 지정
  1. 파일 웹 응용 프로그램의에는 <persistence-unit-ref><persistence-unit-ref-name> 매개 변수가 persistent.xml (위에 표시된)에 지정된 persistence/XXX JNDI 이름이어야하는 정의를 포함해야합니다.

  2. 마지막으로 JDBC 연결에 대한 JNDI 이름을 정의하는 응용 프로그램 서버 (AS 종속)에서 JNDI 정의를 작성해야합니다. 이 이름은 persistence.xml 파일의 <jta-data-source> xml 태그와 일치해야하며 이며 JPA 정의와 응용 프로그램 서버에 정의 된 JDBC 사이의 유일한 링크입니다.

  3. 반올림하려면

    • 응용 프로그램 컨텍스트 봄 파일
      <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.x DBM의 드라이버가 연결 정의에 jdbc/DSN 링크 : ㎖ (만 @PersistenceContext 표시)
      ...
      <persistence-unit-ref>
      <persistence-unit-ref-name>persistence/XXX</persistence-unit-ref-name>
      </persistence-unit-ref>
      ...
    • DAO
      ...
      @PersistenceContext(name = "YYY")
      EntityManager em;
      ...
    • 응용 프로그램 서버 파일. 사용 된 AS 및 DBM에 따라 다름. > Spring 애플리케이션 컨텍스트 파일 - ->이 persistence.xml을하고 web.xml의 파일 -> 응용 프로그램 서버의 JNDI 이름

따라서, 당신은 DAO 사이의 연결을 볼 수 있습니다. 전체 Java EE 애플리케이션 서버 (예 : WAS, Weblogic 또는 GlassFish)를 사용하는 경우 Spring 인터페이스 모듈을 사용할 필요가 없습니다. (Spring 문서, 12.6.3 절 참조).