Я успешно использую 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