我在EJB 2.1 Stateless中成功使用JPA(Jboss 4.2 / Hibernate),从Jndi检索Entity Manager Factory(使用persistence.xml jboss.entity.manager.factory.jndi.name属性发布) .
当切换到Spring Entity Manager注入时,为了使它在websphere中工作,我在执行时遇到“java.lang.IllegalArgumentException:删除分离的实例”:
MyEntity entity = aDao.read(pKey);
aDao.delete(entity);
这让我觉得Spring没有重用JTA事务,而是创建一个事务来读取实体,另一个事务是删除实体 .
我的 spring 配置是:
<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?
我试过没有(重新)定义实体管理器工厂,但是注入失败了,我得到了没有名为'mypersistenceunit'的bean
谢谢你的指针
Edit 1: 这是我对hibernate的持久性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" />
Edit 2: 事务由容器(CMB EJB 2.1 Stateless)管理,该容器使用Jndi的Entity Manager在Jboss下工作
Edit 3: 利用EJB 2.1 Session中引用的jndi资源名称,jee:jndi-lookup id = "dataSource" resource-ref = "true" jndi-name = "jdbc/myDataSourceRef",没有解决问题 .
Edit 4: Hibernate版本是3.2.1.ga,由Jboss提供为JPA实现