1

我在 EJB 2.1 Stateless 中成功使用 JPA(Jboss 4.2 / Hibernate),从 Jndi 检索实体管理器工厂(使用 persistence.xml jboss.entity.manager.factory.jndi.name 属性发布)。

当切换到 Spring Entity Manager 注入时,为了让它在 websphere 中工作,我在执行时收到“java.lang.IllegalArgumentException : Removing a detached instance”:

    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 一起使用?

我尝试不(重新)定义实体管理器工厂,但随后注入失败,我得到 No bean named '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),该容器使用 Jndi 的实体管理器在 Jboss 下工作

编辑 3: 使用 EJB 2.1 会话中引用的 jndi 资源名称 jee:jndi-lookup id="dataSource" resource-ref="true" jndi-name="jdbc/myDataSourceRef" 没有解决问题。

编辑 4: Hibernate 版本是 3.2.1.ga,由 Jboss 作为 JPA 实现提供

4

0 回答 0