服务方法参数、对象标识符与对象引用

Service method arguments, object identifiers vs object references

我知道将对象传递给服务方法可能会更好,但是如果调用者在调用服务之前必须首先查找对象,情况仍然如此吗?如果是,为什么?

例子

假设我有一个 RoleService,它为给定的用户添加了一个角色。假设 RoleService 是通过 Web 控制器或可能是 REST API 调用的。 Web 控制器将 userId 和 roleId 作为来自 Web 请求的输入。

我使用这种服务方式会更好吗?

public void addRoleToUser(long userId, long roleId) {
    User user = userRepository.find(userId);
    Role role = userRepository.find(roleId);
    user.addRole(role);
}

还是这个?在这种情况下,Web 控制器显然需要在调用服务之前检索这两个对象。

public void addRoleToUser(User user, Role role) {
    user.addRole(role);
    userRepository.save(user);
}

无论是通过 Web 控制器还是 REST API 调用,传入请求只会提供 2 个 ID,因此您必须在某处执行 find() 调用。

您当然不能相信调用者拥有关于这两个对象的最新信息,如果您无论如何都只打算使用 ID,那么传输完整的对象是一种浪费。

通常服务API也是数据库事务边界(服务class或注解@Transactional的方法),所以最好有服务方法执行 find()addRole() 调用,因此它们都在单个数据库事务中执行。