如何在Spring-MVC控制器中使用Hibernate实体类映射表单参数

时间:2018-01-24 00:46:18

标签: java spring hibernate spring-mvc jpa

我是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>

2 个答案:

答案 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.idcategory.name

查看我的另一个answer

我建议不要在查看中公开实体,尝试在 DTO 中获取表单数据,然后转换为实体..