Spring中调用save方法保存员工后如何在响应中返回关联部门名称
问题原因
你当前得到的部门name为null,核心原因是:请求传入的Employee对象中关联的Department仅携带id属性,JPA执行save操作时仅会将该id作为外键存入员工表,不会主动查询关联的部门完整数据填充到返回的实体中,最终返回的部门对象就是请求传入的无name的对象。
最简便的实现方案
方案1:保存后重新查询员工实体(零额外配置,代码改动最小)
默认@OneToOne关联的抓取策略为EAGER,仅需在save后调用一次findById查询刚保存的员工,JPA会自动关联查询到完整的部门字段:
@Autowired private EmployeeRepository repository; public ResponseEntity<Employee> create(Employee employee) throws URISyntaxException { Employee savedEmployee = repository.save(employee); // 新增一行重新查询完整数据 savedEmployee = repository.findById(savedEmployee.getId()).orElseThrow(); URI location = new URI(String.format("/employee/%s", savedEmployee.getId())); return ResponseEntity.created(location).body(savedEmployee); }
方案2:保存前先查询部门(额外附带参数校验能力)
如果需要提前校验传入的部门id是否合法,避免存入无效外键,可以先查询部门再赋值给员工后保存:
@Autowired private EmployeeRepository employeeRepository; @Autowired private DepartmentRepository departmentRepository; public ResponseEntity<Employee> create(Employee employee) throws URISyntaxException { // 先校验并查询完整的部门信息 Department department = departmentRepository.findById(employee.getDepartment().getId()) .orElseThrow(() -> new RuntimeException("部门id不存在")); employee.setDepartment(department); Employee savedEmployee = employeeRepository.save(employee); URI location = new URI(String.format("/employee/%s", savedEmployee.getId())); return ResponseEntity.created(location).body(savedEmployee); }
方案3:使用EntityManager刷新实体(无需手动调用查询方法)
如果不想手动写查询逻辑,可以注入EntityManager调用refresh方法,自动刷新实体的全量字段包括关联数据:
@PersistenceContext private EntityManager entityManager; @Autowired private EmployeeRepository repository; public ResponseEntity<Employee> create(Employee employee) throws URISyntaxException { Employee savedEmployee = repository.save(employee); // 刷新实体,拉取数据库最新的完整数据 entityManager.refresh(savedEmployee); URI location = new URI(String.format("/employee/%s", savedEmployee.getId())); return ResponseEntity.created(location).body(savedEmployee); }
内容的提问来源于stack exchange,提问作者Spring beginner
相关产品推荐
相关产品推荐

