gpt4 book ai didi

java - 使用 JPA 处理 API REST 中的子实体插入

转载 作者:行者123 更新时间:2023-12-01 17:00:27 24 4
gpt4 key购买 nike

我有一个父/子实体,其定义如下:

员工类别中:

    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL )
@JsonManagedReference
private List<Phone> phones = new ArrayList<>();

电话类(class)中:

    @ManyToOne
@JsonBackReference
private Employee employee;

当我想在 PhoneService 内的资源 /employees/{employeeId}/phones/{id} 中插入或获取新手机时

    @Override // POST
public Phone createPhone(long employeeId, @Valid Phone phone) {
Employee employee = employeeRepository.findById(employeeId).orElseThrow(() ->
new EntityNotFoundException("Could not find an employee for the provided ID.")
);

// ## option 1
employee.addPhone(phone);
phone.setEmployee(employee);

employeeRepository.save(employee);

return phoneRepository.findById(phone.getId()).orElseThrow(() ->
new EntityNotFoundException("Could not find a phone for the provided ID.")
);

// ## option 2
// phone.setEmployee(employee);
// return phoneRepository.save(phone);
}

@Override // GET
public Phone getPhone(long employeeId, long id) {
return phoneRepository.findById(id).orElseThrow(() ->
new EntityNotFoundException("Could not find a phone for the provided ID.")
);
}

我觉得选项 2 更容易,但从技术上讲我做错了,因为我直接在数据库中寻找手机而不关心其员工的 ID。

最佳答案

我认为选项2是正确的。您唯一错过的是在 (PhoneNumber + Ic) 上添加一个唯一的键,因为逻辑上一个 (phoneNumber + ic) 应该只与一名员工相关。

关于选项1,API名为“createPhone”,但它实际上是对Employee表进行操作,我认为这是误导和错误的。

更合适的代码应该是这样的:

public Phone createPhone(Long employeeId, Phone phone) {
phone.setEmployeeId(employeeId);
return phoneRepository.save(phone);
}

//Ohter API about update an employee with the whole phone list
public Phone updateEmployee(Long employeeId, List<Phone> phones) {
Employee employee = employeeRepository.findById(employeeId).orElseThrow(() ->
new EntityNotFoundException("Could not find an employee for the provided ID.")
);
employee.setPhone(phones);
employeeRepository.save(employee);
}

关于java - 使用 JPA 处理 API REST 中的子实体插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61515059/

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