猿问

JPA - 保存方法寻找联接表而不是更新记录

我有一个 RESTful 端点,根据记录是否已经存在,将使用 JPA 的.save()方法插入新记录或更新数据库中的现有记录。


我遇到的问题是,当尝试更新现有记录时,JPA 将尝试访问不存在的表,employee_department. 我想这是因为在我的Employee实体上我与实体有@ManyToOne关系Department。


仅当我尝试将所有Employee model数据(从 POST 请求发送的数据)映射到Employee entity. 我会得到一个错误,即数据库中没有名为employee_department. 相反,如果我创建一个扩展 JPAfindByEmail(employee.getEmail())的方法EmployeeRepository,并尝试将该数据直接保存回数据库,则不会出现错误。


model -> entity我的问题是,与仅从数据库返回记录并保存相比,在尝试保存之前映射可能会丢失什么?


这是来自client -> controller -> service -> mapper然后返回到客户端的数据流。


POST 请求中的客户端 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);

    }

员工控制器 -> 员工服务

@Service

public 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正在“更新”的内容直接来自数据库,那么一切都像魅力一样。


千万里不及你
浏览 145回答 1
1回答

largeQ

上的@OneToMany注释EmployeeEntity.ManagedDepartments没有指定mappedBy属性,这是双向关系在“一”侧所必需的。看来这种关系确实是双向的,所以应该是@OneToMany(mappedBy = "manager")private Set<DepartmentEntity> ManagedDepartments;如果关系实际上是单向的,那么它将被映射到一个辅助表,就像您的 JPA 提供程序在错误情况下所寻找的那样。此外,在实践中是否实际查找该表取决于特定实体对象的详细信息以及您如何操作它们,这似乎是合理的。
随时随地看视频慕课网APP

相关分类

Java
我要回答