Spring Data JPA实现一对一关系时JSP表单识别及关联表存储问题
问题1:JSP表单无法识别employee模型属性修复方案
- 首先在JSP文件顶部引入Spring form标签库,否则
<form:form>标签无法解析绑定的模型属性:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
- 修正
addNewEmployee接口的参数注解冲突:@ModelAttribute用于接收表单x-www-form-urlencoded格式的参数,@RequestBody用于接收JSON格式的请求体,二者不能同时使用,直接删除@RequestBody注解即可:
@RequestMapping(value = "/addNewEmployee",method = RequestMethod.POST) @ResponseBody public Employee addNewEmployee(@ModelAttribute("employee") Employee employee) { Employee employeeResponse = employeeService.saveEmployee(employee); return employeeResponse; }
- 补充双向关联的序列化配置:在
EmployeeDetail类的employee属性上添加@JsonIgnore注解,避免返回JSON时出现循环引用导致序列化失败。
问题2:实现新增员工时自动写入EmployeeDetail外键
- 首先确认两个实体类的主键配置正确,
Employee类的employeeId字段必须添加主键生成策略,示例配置如下:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 对应数据库主键自增规则 private Long employeeId;
- 补充非空判断避免空指针:在
saveEmployee方法中先判断employeeDetail是否为空,避免前端未提交详情字段时报NPE,也可以直接在Employee类中初始化employeeDetail:
// 方式1:service层加非空判断 public Employee saveEmployee(Employee employee) { EmployeeDetail employeeDetail = employee.getEmployeeDetail(); if(employeeDetail != null) { employeeDetail.setEmployee(employee); } employee = employeeRepository.save(employee); return employee; } // 方式2:Employee类中初始化关联属性 @OneToOne(mappedBy = "employee", cascade = CascadeType.ALL) private EmployeeDetail employeeDetail = new EmployeeDetail();
- 你的现有级联配置本身是正确的:
Employee作为关联关系的被维护端,mappedBy指向EmployeeDetail中的employee属性,外键维护权在EmployeeDetail侧,当你调用employeeRepository.save(employee)时,CascadeType.ALL会自动级联保存employeeDetail,且你已经主动给detail设置了关联的employee对象,JPA会自动将生成的employeeId写入employees_details表的employeeId外键字段。
内容的提问来源于stack exchange,提问作者Stefan Jankovic
相关产品推荐
相关产品推荐

