0

我正在使用与休眠集成的 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文件。正如我已经提到的,检索操作正在工作,所以我相信配置应该是好的。

4

2 回答 2

0

我确定问题不在 JPA 中,它与 spring 用于在控制器内将表单参数转换为有效对象的方式有关。基本上两个问题是关于同一个问题:

来自表单的值始终是字符串,因此在控制器中公开的 bean 应该将其所有属性都作为字符串,以便能够将表单的参数传递给 bean 属性。我认为这个过程被命名为绑定。

这个错误就是为什么我说:无法将类型“java.lang.String”的属性值转换为属性“部门”所需的类型“com.spring.persistence.Dept”,总是发送字符串。但并非所有属性都是字符串,其中一个是 Dept,因此无法进行转换。

要解决这个问题,您可以使用只包含字符串的 POJO,最简单的解决方案是,表单中的所有参数都应命名为 bean 中的属性。为什么您不尝试使用 bean 表单之类的东西而不是控制器中的实体 bean?

或者我认为更完整的解决方案是用@ModelAttribute 和@InitBinder 实现一些东西,不太确定,所以要小心这个评论XD。

于 2014-01-31T07:41:39.647 回答
-1

问题 1:强烈建议您使用 Spring JSTL 中的标签。它将解决此错误以及未来可能出现的错误。

问题 2:不要在 POJO 中使用原语。而且我认为这与问题1有关

于 2014-01-31T10:27:48.257 回答