【问题标题】:How to handle transactions with Spring Data JPA?如何使用 Spring Data JPA 处理事务?
【发布时间】:2013-08-26 18:43:06
【问题描述】:

我即将开始创建一个新应用程序,并希望就我计划使用的方法获得一些反馈。我们将使用 spring 和 spring data jpa。

  1. 控制器可以调用域服务和存储库,还是应该只调用应用程序和基础设施服务?

  2. 如果“可以”从控制器调用域服务和存储库并且域服务操作需要事务,我可以/应该将@Transactional 注释放在域服务方法上吗?或者我应该有一个包装调用的应用程序服务(不确定我是否喜欢这种方法,因为你最终会得到一堆传递方法)?

  3. 如果不能从控制器调用域服务和存储库,我是否需要创建应用程序服务来包装所有可能的域服务调用(就像我在 2 中所说的那样,这可能是很多传递方法)?

我能想到的最佳解决方案如下:

  1. 存储库将具有 @Transactional 注释,在写入数据库时​​传播 REQUIRED,传播设置为 readOnly=true,从数据库读取时传播设置为 SUPPORTS。

  2. 应用程序和域服务将根据需要添加@Transactional 注释

如果控制器需要直接调用存储库、域服务或应用程序服务,它可以。没有通过。

【问题讨论】:

    标签: spring jpa transactions transactional


    【解决方案1】:

    我个人只会从您的控制器访问您的域和应用程序服务。这样,您只需将 @Transactional 注释放在一个“级别”上。如果您正在扩展常规 Spring Data 存储库接口,您可以在存储库层获得开箱即用的事务性。我会尽可能简单地保留该层。将您的readOnly 和其他配置放在服务层。

    如果您决定更改您的 DAO 实现,创建“传递”方法也可以让您在以后获得更大的灵活性。

    【讨论】:

      【解决方案2】:

      我不清楚你的问题。域服务在做什么?我非常了解应用程序服务和域存储库。

      spring 分为服务层和数据访问层两层。 服务层可以使用@Service(在您的设计中它将是应用程序服务)但不能使用@Transactional Tag。

      数据访问层使用了@Repository Tag,也使用了@Transactional Tag,因为这个层是直接连接到Database,进行操作的。所以,我想知道域服务的功能是什么。我不清楚。

      谢谢哥们。

      【讨论】:

      • 域服务代表处理现实世界域的东西,应用程序服务处理你的应用程序需要做的东西。有很多帖子更详细地解释了它。这是我找到的第一个:stackoverflow.com/questions/3839386/…
      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2011-08-06
      • 2020-09-06
      • 2018-08-07
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多