我在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实现