在弹簧集成JPA模型中插入期间获得异常

时间:2014-01-30 17:50:54

标签: java hibernate spring-mvc jpa spring-orm

我使用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文件。正如我已经提到的,检索操作正在运行,因此我认为配置应该很好。

2 个答案:

答案 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有关