我是Hibernate / JPA的新手,我正在尝试使用hibernate实体类获取form参数。直到我尝试使用与其他类有关系的Entity类获取参数时才会出现问题。例如;
控制器:
@RequestMapping(value = "/addProduct", method = RequestMethod.POST)
public String addProduct(Model model, Product product) {
databaseService.insert(product);
return "redirect:/products";
}
实体类:
@Entity
@Table(name = "products")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private String id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
private Category category;
@Column(name = "name")
private String name;
@Column(name = "price")
private String price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
分类:
@Entity
@Table(name = "categories")
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private String id;
@Column(name = "name")
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
该程序无法设置“类别”。因为category不是类型int,string ..我意识到这个问题。但我找不到使用Entity类映射参数的解决方案。有没有办法解决这个问题。或者我应该使用@RequestParam逐个获取参数,而不是使用实体类映射参数。
更新
我只是在.jsp页面中将category
更改为category.id
,它解决了我的问题。
旧代码
<form>
...
<select class="form-control" name="category">
<c:if test="${not empty categoryList}">
<c:forEach var="item" items="${categoryList}">
<option value="${item.getId()}">${item.getName()}</option>
</c:forEach>
</c:if>
</select>
</form>
新代码
<form>
...
<select class="form-control" name="category.id">
<c:if test="${not empty categoryList}">
<c:forEach var="item" items="${categoryList}">
<option value="${item.getId()}">${item.getName()}</option>
</c:forEach>
</c:if>
</select>
</form>
答案 0 :(得分:0)
一种方法是创建自定义 Spring Converter 。因此,假设您将实体的ID作为路径变量传递,并且您的转换器实现将为您获取该产品对象。
在您的控制器中,您需要执行以下操作:
@RequestMapping(value = "/addProduct/{id}", method = RequestMethod.POST)
public String addProduct(Model model, @PathVariable("id") Product product) {
databaseService.insert(product);
return "redirect:/products";
}
你的转换器看起来像这样:
import org.springframework.core.convert.converter.Converter;
public class StringToProductConverter implements Converter<String, Product> {
...
@Override
public Product convert(String id) {
Product product = databaseService.getProduct(id);
...
return product;
}
并且不要忘记以编程方式或XML格式注册您的Converter,具体取决于您正在处理的Spring版本。
答案 1 :(得分:0)
请告诉我们您的表格映射,
然后可以尝试,将<form:select>
/ <form:input>
代码中的路径更改为category.id
和category.name
查看我的另一个answer
我建议不要在查看中公开实体,尝试在 DTO 中获取表单数据,然后转换为实体..