gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:07:20 27 4
gpt4 key购买 nike

我正在编写一个提供管理 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);
}
}

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

我尝试添加 @事务 注释到 REST 方法本身,但它似乎被忽略了,或者与 CXF 冲突。
  • 您认为在请求级别委派事务而不再为它烦恼是个好主意吗?
  • 如何让 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 服务的配置中可见





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

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com