Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务方法参数、对象标识符与对象引用_Java_Spring_Rest_Web Services_Architecture - Fatal编程技术网

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

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

我理解将对象传递到服务方法中可能更好,但是如果调用方在调用服务之前必须首先查找对象,这种情况仍然存在吗?如果是,为什么

示例

假设我有一个RoleService,它为给定的用户添加了一个角色。假设RoleService是通过web控制器或RESTAPI调用的。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也是数据库事务边界(用
@Transactional
注释的服务类或方法),因此最好让服务方法执行
find()
addRole()
调用,以便它们都在单个数据库事务中执行