Внедрение Spring-менеджера сущностей в EJB 2.1 CMP (Jboss 4.2 / Websphere 6.1) с Hibernate - PullRequest
1 голос
/ 07 января 2011

Я успешно использую JPA (Jboss 4.2 / Hibernate) в EJB 2.1 без сохранения состояния, получая фабрику Entity Manager из Jndi (опубликовано с использованием свойства persistence.xml jboss.entity.manager.factory.jndi.name).

При переключении на внедрение Spring Entity Manager, чтобы заставить его работать в веб-сфере, я получаю «java.lang.IllegalArgumentException: Удаление отдельного экземпляра» при выполнении:

    MyEntity entity = aDao.read(pKey);
    aDao.delete(entity);

Это заставляет меня думать, что Spring не повторно использует транзакцию JTA, а создает одну транзакцию для чтения сущности, а другую - для удаления сущности.

Моя конфигурация пружины:

    <jee:jndi-lookup id="dataSource" resource-ref="true" jndi-name="java:OracleDSxa" />

  <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

<tx:jta-transaction-manager />
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
     <property name="persistenceUnitName" value="mypersistenceunit" />
    </bean>

Что-то не так с конфигурацией Spring? Когда я сам представляю EntityManagerFactory как синглтон, он работает, является ли это подходящим решением и почему он не работает с Spring?

Я попытался без (пере) определения фабрики диспетчера сущностей, но затем инъекция завершилась неудачно, и я не получил bean-компонент с именем 'mypersistenceunit'

Спасибо за любой указатель

Редактировать 1: Вот моя постоянная XML-конфигурация для спящего режима:

        <property name="hibernate.transaction.factory_class" value="org.hibernate.ejb.transaction.JoinableCMTTransactionFactory" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
        <property name="hibernate.connection.release_mode" value="auto" />
        <property name="hibernate.current_session_context_class" value="jta" />
        <property name="hibernate.transaction.flush_before_completion" value="true" />
        <property name="hibernate.transaction.auto_close_session" value="false" />

Редактировать 2: Транзакция управляется контейнером (CMB EJB 2.1 Stateless), который работает под Jboss, используя Entity Manager из Jndi

Редактировать 3: Использование имени ресурса jndi, указанного в сеансе EJB 2.1, jee: jndi-lookup id = "dataSource" resource-ref = "true" jndi-name = "jdbc / myDataSourceRef", не решило проблему.

Редактировать 4: Версия Hibernate - 3.2.1.ga, предоставленная Jboss в качестве реализации JPA

...