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