Проблема с весенним DB2 JPA Entity Manager - PullRequest
0 голосов
/ 09 января 2011

Я пытаюсь настроить Spring, JPA и DB2, чтобы экземпляр диспетчера сущностей использовался в моих контроллерах 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]

Я не знаю, как это можно исправить. Кто-нибудь сталкивался с этой проблемой?

Заранее спасибо.

[EDIT] Это мой файл 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 ]

1 голос
/ 05 ноября 2011

Я полагаю, что вы делаете неправильную конфигурацию, потому что вы настраиваете ее "а-ля Tomcat".Если вы используете сервер приложений Java EE, например WAS, вам необходимо:

  1. В XML-файле контекста приложения Spring

    • настроитьКомпонент 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> должен указывать на name=YYY параметр определения Entity Manager в DAO, то есть @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 именем JNDI, как указано в файле persistence.xml (показано выше)).

  3. Наконец, вы должны создать определение JNDI на сервере приложений (в зависимости от AS), которое определяет имя JNDI для соединения JDBC.Это имя должно соответствовать тегу <jta-data-source> xml в файле persistence.xml, , и это единственная связь между определением JPA и JDBC, определенным на сервере приложений.

  4. Для округления:

    • Файл Spring контекста приложения
      <bean class=" Класс реализации DAO " /><br> <jee:jndi-lookup id="YYY" jndi-name="persistence/XXX" /><br> <tx:annotation-driven /><br> <tx:jta-transaction-manager />

    • файл persistence.xml
      <persistence-unit name="XXX" transaction-type="JTA"><br> <jta-data-source>jdbc/DSN</jta-data-source><br> </persistence-unit>

    • файл web.xml
      ...<br> <persistence-unit-ref><br> <persistence-unit-ref-name>persistence/XXX</persistence-unit-ref-name><br> </persistence-unit-ref><br> ...
    • DAO (показан только @PersistenceContext)
      ...<br> @PersistenceContext(name = "YYY")<br> EntityManager em;<br> ...
    • Сервер приложений: jdbc/DSN указывает на определение соединения, где находится драйвер для DBM.Зависит как от AS, так и от используемой DBM.

Таким образом, вы можете увидеть связь между DAO -> Spring Application Context file -> persistence.xml и web.xmlфайлы -> имена JNDI сервера приложений.Если вы используете полноценный сервер приложений Java EE (например, WAS, Weblogic или GlassFish), вам не нужно использовать интерфейсные модули Spring;только определения на сервере приложений (см. документацию Spring, раздел 12.6.3).

1 голос
/ 09 января 2011

В WebSphere включена реализация JPA. Так что нет необходимости добавлять openjpa в вашу библиотеку. На самом деле, WebSphere использует OpenJPA, поэтому вы ничего не теряете. Смотрите здесь для более подробной информации

При использовании jda-data-source необходимо иметь transaction-type="JTA". Также не следует указывать свойства соединения - они указаны в источнике данных.

И избавьтесь от <provider> - документ, на который я ссылаюсь, гласит:

Если в элементе файла persistence.xml в модуле EJB не настроен поставщик JPA, используется поставщик JPA по умолчанию, который в данный момент настроен для этого сервера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...