java - JPA 事务和 REST 服务 : Good practices

标签 java spring jpa cxf

我正在编写一个应用程序,提供管理 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. 您认为在请求级别委托(delegate)事务并且不再担心它是一个好主意吗?
  2. 如何让 Spring 或 CXF 将事务管理绑定(bind)到我的请求?

预先感谢您的建议。

最佳答案

Do you think it is a good idea to delegate the transaction at the request level and not to bother about it anymore ?

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

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

所以基本上,你有 3 层:

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

How can I have Spring or CXF bind the transaction management to the requests for me?

请确保您:

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

    <tx:annotation-driven transaction-manager="txManager"/>

关于java - JPA 事务和 REST 服务 : Good practices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15364318/

相关文章:

java - Apache Curator DistributedQueue 的 lockPath 是如何工作的?

java - 当我绘制大尺寸图像时,java中的原因是什么,导致速度缓慢?

java - Spring MVC - 是否有替代方法来显示表单验证错误消息(不使用 @ModelAtrribute 和 @Valid)?

JPA,我怎么知道什么将被保存回数据库

java - 使用ansible安装Java JDK时出现404错误

java - 是否有 python random._urandom() 的 java 等价物?

java - Spring中bean的初始化顺序

java - Spring Boot native 在构建期间启用 https

java - 使用 spring petclinic 示例和 hsqldb 的 jpa 查询语法

java - QueryDSL 窗口函数