我使用Spring集成了hibernate并在实体对象中使用JPA注释。我创建了这个项目来测试使用这种组合的CRUD操作。我能够从数据库加载数据但面临插入问题。
我有2张桌子。
员工:ID,NAME,AGE,DEPT
部门:DEPT_ID,DEPT_NAME
Employee.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
Dept.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");
}
}
My 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: 另一个问题是,我在实体类中使用员工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)
我甚至用Google搜索答案,但无法得到正确答案。有人可以帮我吗? 谢谢,
P.S:我没有在这里保留spring配置和web.xml文件。正如我已经提到的,检索操作正在运行,因此我认为配置应该很好。
答案 0 :(得分:0)
我确定问题不在JPA中,它与spring用于在控制器内的有效Object中转换表单参数的方式有关。 基本上两个问题是关于同一个问题:
来自表单的值总是String,因此在控制器中公开的bean应该具有String的所有属性,以便能够将表单的参数传递给bean属性。我认为这个过程被命名为绑定。
这个错误就是我说的原因: 无法将类型'java.lang.String'的属性值转换为属性'department'的必需类型'com.spring.persistence.Dept',始终将String发送。但并非所有属性都是String,其中一个是Dept,因此无法进行转换。
要解决此问题,您可以使用仅包含字符串的POJO,这是最简单的解决方案,表单中的所有参数都应该被命名为bean中的属性。为什么你不尝试使用bean形式而不是控制器中的实体bean?
或者我认为是一个更完整的解决方案是使用@ModelAttribute和@InitBinder实现的,不太确定,所以请注意这个注释XD。
答案 1 :(得分:-1)
问题1:强烈建议您使用Spring JSTL中的标记。它将解决此错误,并可能解决未来的错误。
问题2:不要在POJO中使用原语。而且我认为这与问题1有关