我在使用关系添加/更新记录时遇到问题。可以请一些建议如何运作?
我有两个实体:问题和类别:
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
我试图寻找类似的问题,但我找不到任何东西..所以,如果有人可以帮助/建议或显示类似问题的链接,我将不胜感激!
干杯!
答案 0 :(得分:1)
您需要为Spring提供代码,告诉它如何将网页中的字符串值转换回Category对象。这可以通过以下任一方式完成:
答案 1 :(得分:1)
使用hibernate对象映射表单项是一种不好的做法。有两种解决方案
将另一个属性private transient String categoryString;
添加到'Question'
类。并将UI类别映射到此<form:select path="categoryString" items="${categoryList}" />
这样你可以避免错误。
不要使用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);