gpt4 book ai didi

java - Spring 启动: how to update object efficently?

转载 作者:行者123 更新时间:2023-12-02 00:57:53 25 4
gpt4 key购买 nike

大家好,我是 Spring 世界的新手。其实我想知道如何使用转换器来更新对象,而不是使用 set 和 get 来一一更新每个元素。现在在我的 Controller 中我已经:

    @PostMapping("/edit/{userId}")
public Customer updateCustomer(@RequestBody Customer newCustomer, @PathVariable final String userId)
{
return customerService.update(userId, newCustomer);
}

这就是我更新客户对象的方式:

    @Override
public Customer update(String id, Customer newCustomer) {
Customer customer = customerRepository.findById(id).get();

customer.setFirstName(newCustomer.getFirstName());
customer.setLastName(newCustomer.getLastName());
customer.setEmail(newCustomer.getEmail());

return customerRepository.save(customer);
}

我不想使用每次设置和获取,而是想使用转换器。

最佳答案

在更新实体时将实体的 id 作为路径变量传递的方法并不正确。想想看:你有一个 @RequestBody ,为什么不在这个 body 中也包含 id 呢?为什么要为其指定路径变量呢?

现在,如果您有完整的 Customer使用主体中的 id,您不必对存储库进行任何调用,因为 hibernate 将其添加到 persistent状态已经基于它的 id 和一个简单的

public Customer update(Customer newCustomer) {
return customerRepository.save(newCustomer);
}

应该可以工作。

问:什么是持久状态?

答:持久实体已与数据库表行关联,并且由当前运行的持久上下文管理。 ( customerRepository.findById() 只是询问数据库具有指定 id 的实体是否存在并将其添加到持久状态。如果您有 @Id 带注释的字段并已填充,则 Hibernate 管理所有此过程,换句话说:

   Customer customer = new Customer();
customer.setId(1);

几乎与:

相同
   Customer customer = customerRepository.findById(1).get();

)

提示:无论如何,您不应该(如果您不知道) Controller 层中存在模型。为什么?假设您的 Customer模型可以有多个权限。一种可能的结构如下所示:

@Entity
public class Customer{
//private fields here;

@OneToMany(mappedBy="customer",--other configs here--)
private List<Permission> permissions;
}

@Entity
public class Permission{
@Id
private Long id;

private String name;

private String creationDate;

@ManyToOne(--configs here--)
private Customer customer;
}

您可以看到 Customer 之间有交叉引用和Permission最终会导致堆栈溢出异常(如果你不明白这一点,你可以想象一个递归函数,它没有停止条件,并且一遍又一遍地调用=>堆栈溢出。同样的事情正在发生在这里)。

你能做什么?创建一个所谓的DTO您希望客户端接收的类而不是模型。如何创建这个 DTO?想想用户需要知道什么。

1) “creationDate”来自 Permission用户必填字段?事实并非如此。

2) “id”来自 Permission用户必填字段?在某些情况下是的,在其他情况下则不是。

可能的CustomerDTO可能看起来像这样:

public class CustomerDTO
{
private String firstName;
private String lastName;
private List<String> permissions;
}

你可以注意到我正在使用 List<String>而不是List<Permission>客户的权限实际上是权限的名称。

public CustomerDTO convertModelToDto(Customer customer)
{
//hard way
CustomerDTO customerDTO = new CustomerDTO();
customerDTO.setFirstName(customer.getFirstName());
customerDTO.setLastName(customer.getLastName());
customerDTO.setPermissions(
customer.getPermissions()
.stream()
.map(permission -> permission.getName())
.collect(Collectors.toList());
);

// easy-way => using a ModelMapper
customerDTO = modelMapper.map(customer,CustomerDTO.class);

return customerDTO;
}

关于java - Spring 启动: how to update object efficently?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61086060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com