Java 服务方法参数、对象标识符与对象引用
我理解将对象传递到服务方法中可能更好,但是如果调用方在调用服务之前必须首先查找对象,这种情况仍然存在吗?如果是,为什么 示例 假设我有一个RoleService,它为给定的用户添加了一个角色。假设RoleService是通过web控制器或RESTAPI调用的。web控制器将userId和roleId作为web请求的输入 使用这种服务方式会更好吗Java 服务方法参数、对象标识符与对象引用,java,spring,rest,web-services,architecture,Java,Spring,Rest,Web Services,Architecture,我理解将对象传递到服务方法中可能更好,但是如果调用方在调用服务之前必须首先查找对象,这种情况仍然存在吗?如果是,为什么 示例 假设我有一个RoleService,它为给定的用户添加了一个角色。假设RoleService是通过web控制器或RESTAPI调用的。web控制器将userId和roleId作为web请求的输入 使用这种服务方式会更好吗 public void addRoleToUser(long userId, long roleId) { User user = userRe
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也是数据库事务边界(用@Transactional
注释的服务类或方法),因此最好让服务方法执行find()
和addRole()
调用,以便它们都在单个数据库事务中执行