如何使用Spring Data JPA处理事务?

时间:2013-08-23 16:18:37

标签: spring jpa transactions transactional

我即将开始创建一个新的应用程序,并希望得到一些关于我计划使用的方法的反馈。我们将使用弹簧和弹簧数据jpa。

  1. 控制器是否可以调用域服务和存储库,还是控制器只能调用应用程序和基础结构服务?

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

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

  4. 我能想出的最佳解决方案如下:

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

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

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

      enter image description here

2 个答案:

答案 0 :(得分:0)

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

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

数据访问层使用@Repository Tag以及@Transactional Tag,因为此层直接连接并使用数据库进行操作。所以,我想知道域服务的功能。我不清楚这一点。

谢谢伙伴。

答案 1 :(得分:0)

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

如果您决定更改DAO实施,那么创建“传递”方法也可以让您更加灵活。