我正在使用与休眠集成的 Spring 并在实体对象中使用 JPA 注释。我创建了这个项目来测试使用这种组合的 CRUD 操作。我能够从数据库加载数据,但面临插入问题。
我有 2 张桌子。
员工:ID、姓名、年龄、部门
部门:DEPT_ID,DEPT_NAME
雇员.java
@Entity
@Table(name="EMPLOYEE")
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
private int id;
@Column(name="NAME")
private String name;
@Column(name="AGE")
private int age;
@ManyToOne
@JoinColumn(name="DEPT", referencedColumnName="DEPT_NAME", updatable=false, insertable=false)
private Dept department;
//Other getters and setters
java部门
@Entity
@Table(name="DEPT")
public class Dept implements Serializable {
@Id
@Column(name="DEPT_ID")
private int deptId;
@Column(name="DEPT_NAME")
private String deptName;
@OneToMany(cascade=CascadeType.ALL, mappedBy="department")
private List<Employee> employee;
DAO类:
@Repository
public class EmployeeDAOImpl implements EmployeeDAO {
private HibernateTemplate template;
@Autowired
public void setSessionFactory(SessionFactory factory){
template = new HibernateTemplate(factory);
}
@Override
@Transactional
public void saveEmployee(Employee employee) {
template.saveOrUpdate(employee);
}
@SuppressWarnings("unchecked")
@Override
public List<Employee> getEmployee() {
return template.find("from Employee");
}
}
我的 Spring MVC 控制器类
@Controller
public class EmployeeController {
@Autowired
private EmployeeDAO empDao;
@Autowired
private DeptDAO deptDao;
@RequestMapping(value="/loadInsertForm", method=RequestMethod.GET)
public String loadInsertForm(Model model){
List<Dept> depList = deptDao.getDept();
model.addAttribute("deptObjList", depList);
return "empInsertForm";
}
@RequestMapping(value="/insertEmpValues", method=RequestMethod.POST)
public String insertEmployee(Employee employee){
empDao.saveEmployee(employee);
return "loadEmpList";
}
@RequestMapping(value="/loadEmpList", method=RequestMethod.POST)
public String displayEmpDetails(Model model){
List<Employee> emp = empDao.getEmployee();
model.addAttribute("empList", emp);
return "empList";
}
}
我的 jsp 类从用户那里获取输入。
<form:form method="POST" action="insertEmpValues.spr" commandName="employee">
<table width="30%">
<tr>
<td align="right">Employee ID : </td>
<td><input type="text" name="id" /></td>
</tr>
<tr>
<td align="right">Employee Name : </td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td align="right">Age : </td>
<td><input type="text" name="age" /></td>
</tr>
<tr>
<td align="right">Department : </td>
<td>
<select name="department">
<c:forEach items="${deptObjList}" var="dept">
<option id="${dept.deptName}">${dept.deptName}</option>
</c:forEach>
</select>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" value="Submit" />
</td>
</tr>
</table>
</form:form>
我知道这里的内容有点多。但我想给出所有可能的输入。因此,鉴于所有必需的文件。
现在我可以从表中加载值,但是在插入过程中,我遇到了一些我在此处列出的问题。
问题 1: 如果我在输入表单中输入 ID、姓名、年龄和部门并单击提交,我会收到以下异常。
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'employee' on field 'department': rejected value [POS]; codes [typeMismatch.employee.department,typeMismatch.department,typeMismatch.com.spring.persistence.Dept,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.department,department]; arguments []; default message [department]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.spring.persistence.Dept' for property 'department'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.spring.persistence.Dept] for property 'department': no matching editors or conversion strategy found]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
问题 2: 另一个问题是,我在实体类中使用 Employee ID 作为自动生成的,但是如果我没有在表单中输入 ID 并单击提交,我会收到以下异常。
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'employee' on field 'department': rejected value [VZW]; codes [typeMismatch.employee.department,typeMismatch.department,typeMismatch.com.spring.persistence.Dept,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.department,department]; arguments []; default message [department]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.spring.persistence.Dept' for property 'department'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.spring.persistence.Dept] for property 'department': no matching editors or conversion strategy found]
Field error in object 'employee' on field 'id': rejected value []; codes [typeMismatch.employee.id,typeMismatch.id,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employee.id,id]; arguments []; default message [id]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'id'; nested exception is java.lang.IllegalArgumentException]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
我什至用谷歌搜索了答案,但无法得到正确的答案。有人可以帮我吗?谢谢,
PS:我这里没有保留spring配置和web.xml文件。正如我已经提到的,检索操作正在工作,所以我相信配置应该是好的。