我已经实现了一个 EJB3 / JPA Web 服务,没有任何重大问题,现在我转向了一个 Spring-WS/JPA Web 服务。两者都被部署到 Glassfish。
我对 JPA 的理解有限,但默认情况下事务是容器管理的?你如何改变这个?有了 EJB3,事情就很简单了,因为我可以将其注入EntityManager
到“DAO”中(下次再讨论!),@PersistentContext
容器将负责事务划分。就基本配置而言,就是这样。由于容器使用 JTA,因此我在持久性单元上指定了事务类型“JTA”。在我的带有一个持久性单元的非常简单的示例应用程序中,我不必关心它的名称 - 如果您有多个持久性单元,事情会变得更复杂还是容器会处理这个问题?
现在我已经用 Spring-WS 构建了一个等效的 Web 服务,并重用了我的实体/dao,但我一直在努力让它工作。我在我的应用程序上下文中包含了EntityManagerFactory
( LocalContainerEntityManagerFactoryBean
) 以及JpaTransationManager
(bean 对EntityManagerFactory
) 的 bean 定义。我还包括了PersistenceAnnotationBeanPostProcessor
和tx
命名空间。我不会认为我需要做任何其他事情,但它不会部署没有可用于“null”错误的持久性提供程序。
我是否需要指定要为其创建管理器的实际持久性单元?
谢谢,
更新:
好的,我收到以下错误:javax.persistence.PersistenceException: No Persistence provider for EntityManager named null。
这可能是我对工厂/经理的弹簧配置:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManager" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<tx:annotation-driven/>
我想我可能需要或注入其他东西......
另一个更新:
修复了该问题 - 使用的是LocalEntityManager
而不是LocalContainerEntityManager
.
现在我在持久化我的对象时遇到了问题。我有一个带有子对象作为属性的父对象。当我调用时,我可以看到子对象被持久化在日志中em.persist(parent)
,但父对象没有被持久化。
最后更新:
父对象被持久化了,但是在我尝试检索它之前事务还没有提交(我是在模拟而不是模拟)。想我现在已经掌握了它的要点。