2

我正在编写一个提供管理 JPA 实体(使用 Hibernate)的 REST 服务(使用 Apache-CXF)的应用程序。

我对事务管理有点迷茫,想听听你关于这个话题的建议。

目前,我在我的业务 REST 服务和较低的服务之间放置了一个中间层,仅用于事务管理目的。

目前,我的代码看起来很像:

@Service 
class PersistanceService<MyBusinessClass>{
   MyBusinessClass load(Long id);
   void save(MyBusinessClass businessObject);
}

@Service 
class BusinessService<MyBusinessClass>{
   void doSomethingOn(MyBusinessClass businessObject);
}

@Service
class TransactionBusinessService<MyBusinessClass>{
   @Transactional
   void doSomethingOn(Long id) {
      MyBusinessClass businessObject = persistanceService.load(id);
      businessService.doSomethingOn(businessObject);
      persistanceService.save(businessObject);
   }
}

@Service
@path("/foo")
class RESTService {
   @Path("/doSomething")
   void doSomethingOn(Long id) {
      transactionBusinessService.doSomethingOn(id);
   }
}

我认为TransactionBusinessService是矫枉过正。我希望 ''Spring'' 或 ''CXF'' 为我处理事务:我觉得请求是这样做的良好粒度:在每个请求的开头初始化一个实体管理器,并在最后提交更新.

我尝试将@Transactional注释添加到REST 方法本身,但它似乎被忽略了,或者与CXF 冲突。

  1. 您认为在请求级别委派事务而不再为它烦恼是个好主意吗?
  2. 如何让 Spring 或 CXF 将事务管理绑定到我的请求?

提前感谢您的建议。

4

1 回答 1

3

您认为在请求级别委派事务而不再为它烦恼是个好主意吗?

通常这不是一个好主意,因为:

  • 通常分离事务隔离不是那么方便
  • 如果你需要做一些改变for-loop,每一个都必须有自己的交易,它也不是那么透明;同时在服务层,您可以决定是否需要整个循环是事务性的或每次迭代;
  • tx:annotation-driven(和其他一些 AOP 拦截器)有时会有点不可预测,如果您直接在控制器中使用 AOP 注释(至少我在 Spring MVC/struts2 和其他一些框架中遇到了这样的问题)

所以基本上,你有 3 层:

  • 持久层,只负责存储/获取数据;
  • 服务层,负责数据准备和 AOP 注释(@Transactional@PreAuthorize@Cacheable),其中使用持久层;
  • 控制器级别,它获取请求、绑定业务模型、可能对其进行验证、将模型传递给服务层并从那里返回结果或处理异常

我如何让 Spring 或 CXF 将事务管理绑定到我的请求?

请确保您:

  • 您的配置中有适当TransactionManager的('org.springframework.transaction.PlatformTransactionManager` 实现)
  • 你有tx:annotation-driven你的配置
  • 这些 bean 在 CXF 服务的配置中可见
    <bean name="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </豆>

    <tx:annotation-driven transaction-manager="txManager"/>
于 2013-03-12T15:19:26.247 回答