spring - "@Transactional"应该放在哪里服务层或者DAO

标签 spring transactions dao

首先,我可能会问一些以前被问过和回答过的问题,但我无法得到搜索结果。我们在服务层上定义事务注释,典型的 spring hibernate crud 通常是

Controller->Manager->Dao->Orm .

我现在遇到需要在基于客户端站点的域模型之间进行选择的情况。 假设客户端 A 正在使用我的域模型,一切都很好,但是其他客户端站点会给我一个 Web 服务而不是使用我们的域模型。

我应该更换哪一层。我相信它必须是 DAO,它将从 Web 服务中获取我的数据并将其发送回。即两个单独编写的 DAO 层并根据场景插入。

我现在意识到,当我们将 @Transactional 放在 Service 层时,我们一直在做紧耦合(如果有这样的事情或者说没有松耦合)。这么多的大脑不可能是错的,或者他们是错的(我怀疑)。

所以问题是“应该将“@Transactional”放置在服务层还是 DAO 的位置​​?”我应该更换向下的服务层吗?


11 年过去了,仍然有意义。如果我回顾这个项目,我当时对域模型的理解显然是错误的。我将 ORM 层视为域模型,我们希望使用 ORM 和分离的实体,并且没有任何数据映射,也没有任何 DTO。那是当时的趋势。如今,域模型不是 ORM,拥有适当的域模型并使用 ORM 或 Web 服务是数据源来解决这个问题。就像许多人指出的那样,是的,服务是它的正确位置,并且具有适当的域模型,而不是将 JPA (ORM) 视为域模型。

最佳答案

理想情况下,服务层 (Manager) 代表您的业务逻辑,因此应使用 @Transactional 进行注释。

服务层可能会调用不同的 DAO 来执行 DB 操作。让我们假设一个服务方法中有 3 个 DAO 操作。如果您的第一个 DAO 操作失败,其他两个可能仍会通过,最终您将获得不一致的数据库状态。注释服务层可以让您避免这种情况。

关于spring - "@Transactional"应该放在哪里服务层或者DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3886909/

相关文章:

java - HikariDataSource.getConnection() 在低流量时缓慢,在大流量时快速

java - Spring OAuth2 - 在 token 存储中手动创建访问 token

java - 当我尝试运行一个简单的 Spring 项目时出现错误

hibernate - 清除 hibernate 二级缓存

java - 带有普通 JDBC 的 DAO 生成器工具

java - Hibernate Spatial - 遇到无效的字节序标志值

java - 为后台线程创建 JPA session

php - DB::beginTransaction() 和 DB::transaction() 有什么区别?

ms-access - 如何从表中获取自增字段名?

java - EJB 中的事务管理