Spring MVC + Hibernate:如何处理表单与关系

时间:2014-02-03 20:59:43

标签: java hibernate spring-mvc

我在使用关系添加/更新记录时遇到问题。可以请一些建议如何运作?

我有两个实体:问题类别

public class Question {
    @Id
    @GeneratedValue
    private Long questionId;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category")
    private Category category;

@Entity
@Table(name = "category")
public class Category {
    @Id
    @GeneratedValue
    private Long categoryId;
    private String name;

我有一些类别列表,我想添加选定类别的新问题。所以在我的QuestionController中我添加了方法:

@RequestMapping(value = "/add", method = RequestMethod.GET)
    public ModelAndView add() {
        ModelAndView mav = new ModelAndView("question/add");
        mav.addObject("question", new Question());
        mav.addObject("categoryList", categoryService.getAll());

        return mav;
    }

并形成:

<form:form modelAttribute="question" method="POST" >
    Name: <form:input path="name" value="${ques.name}" /> 
    Category: <form:select path="category" items="${categoryList}" />
    <input type="submit" value="Add" />
</form:form>

现在一切都很好看(我可以填写问题名称并选择类别)。但我不知道如何添加POST方法

@RequestMapping(value = "/add", method = RequestMethod.POST)
    public String added(@ModelAttribute Question question, BindingResult bindingResult) {

    }

当我尝试使用上面的方法时,我有错误:无法将类型'java.lang.String'的属性值转换为所需的类型model.Category

我试图寻找类似的问题,但我找不到任何东西..所以,如果有人可以帮助/建议或显示类似问题的链接,我将不胜感激!

干杯!

3 个答案:

答案 0 :(得分:1)

您需要为Spring提供代码,告诉它如何将网页中的字符串值转换回Category对象。这可以通过以下任一方式完成:

  1. Adding a PropertyEditor to the DataBinder.

  2. Creating a Converter.

答案 1 :(得分:1)

使用hibernate对象映射表单项是一种不好的做法。有两种解决方案

  1. 将另一个属性private transient String categoryString;添加到'Question'类。并将UI类别映射到此<form:select path="categoryString" items="${categoryList}" /> 这样你可以避免错误。

  2. 不要使用hibernate映射类来映射表单项,请使用POJO来执行此操作。然后在你的应用程序的某个地方将这个简单的pojo元素映射到hibernate实体上。

答案 2 :(得分:0)

尝试更改此行:

<form:select path="category" items="${categoryList}" />

为:

<form:select path="category.categoryId" items="${categoryList}" itemLabel="name" itemValue="categoryId"/>

然后在添加的方法(post方法)中,从休眠中检索Category对象并在保存之前设置回问题对象:

Category selectedCategory = yourHibernateService.getCategoryById(question.getCategory().getCategoryId());
question.setCategory(selectedCategory);