千萬(wàn)里不及你
2022-05-21 17:02:44
我有一個(gè) RESTful 端點(diǎn),根據(jù)記錄是否已經(jīng)存在,將使用 JPA 的.save()方法插入新記錄或更新數(shù)據(jù)庫(kù)中的現(xiàn)有記錄。我遇到的問(wèn)題是,當(dāng)嘗試更新現(xiàn)有記錄時(shí),JPA 將嘗試訪問(wèn)不存在的表,employee_department. 我想這是因?yàn)樵谖业腅mployee實(shí)體上我與實(shí)體有@ManyToOne關(guān)系Department。僅當(dāng)我嘗試將所有Employee model數(shù)據(jù)(從 POST 請(qǐng)求發(fā)送的數(shù)據(jù))映射到Employee entity. 我會(huì)得到一個(gè)錯(cuò)誤,即數(shù)據(jù)庫(kù)中沒(méi)有名為employee_department. 相反,如果我創(chuàng)建一個(gè)擴(kuò)展 JPAfindByEmail(employee.getEmail())的方法EmployeeRepository,并嘗試將該數(shù)據(jù)直接保存回?cái)?shù)據(jù)庫(kù),則不會(huì)出現(xiàn)錯(cuò)誤。model -> entity我的問(wèn)題是,與僅從數(shù)據(jù)庫(kù)返回記錄并保存相比,在嘗試保存之前映射可能會(huì)丟失什么?這是來(lái)自client -> controller -> service -> mapper然后返回到客戶端的數(shù)據(jù)流。POST 請(qǐng)求中的客戶端 JSON{ "id": 109,"isActive": true,"manager": null,"firstName": "string","middleInitial": null,"lastName": "string","department": { "id": 101},"jobTitle": { "id": 1001},"email": "g","skypeName": "g","isManager": false}客戶端 -> 員工控制器@RestController@RequestMapping("/emps")public class EmployeeController { @Autowired EmployeeService employeeService; @RequestMapping(method = {RequestMethod.POST, RequestMethod.PUT}) public Employee createOrUpdateEmployee(@RequestBody Employee employee) { return employeeService.storeOrUpdate(employee); }員工控制器 -> 員工服務(wù)@Servicepublic class EmployeeService { @Autowired private EmployeeRepository employeeRepository; @Autowired EmployeeMapper employeeMapper; public Employee storeOrUpdate(Employee employee) { EmployeeEntity employeeEntity = employeeMapper.modelToEntity(employee); EmployeeEntity savedEmployeeEntity = employeeRepository.save(employeeEntity); Employee employeeModel = employeeMapper.entityToModel(savedEmployeeEntity); return employeeModel; }Employee正在“更新”的內(nèi)容直接來(lái)自數(shù)據(jù)庫(kù),那么一切都像魅力一樣。
1 回答

largeQ
TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
上的@OneToMany注釋EmployeeEntity.ManagedDepartments沒(méi)有指定mappedBy屬性,這是雙向關(guān)系在“一”側(cè)所必需的。看來(lái)這種關(guān)系確實(shí)是雙向的,所以應(yīng)該是
@OneToMany(mappedBy = "manager")
private Set<DepartmentEntity> ManagedDepartments;
如果關(guān)系實(shí)際上是單向的,那么它將被映射到一個(gè)輔助表,就像您的 JPA 提供程序在錯(cuò)誤情況下所尋找的那樣。此外,在實(shí)踐中是否實(shí)際查找該表取決于特定實(shí)體對(duì)象的詳細(xì)信息以及您如何操作它們,這似乎是合理的。
添加回答
舉報(bào)
0/150
提交
取消