使用Thymeleaf发布具有多对一关系的数据

夏姆

我有一个简单的模型类Product,它与表现出多对一的关系ProductCategory

产品类别:

@Entity
@Table(name="product")
public class Product {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Long id;

@Column(name="name")
private String name;

@Column(name="description")
private String description;

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

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPdfUrl() {
    return pdfUrl;
}

public void setPdfUrl(String pdfUrl) {
    this.pdfUrl = pdfUrl;
}

public ProductCategory getCategory() {
    return category;
}

public void setCategoryId(ProductCategory category) {
    this.category = category;
}

}

ProductCategory类

@Entity
@Table(name="product_category",uniqueConstraints={@UniqueConstraint(columnNames="name")})
public class ProductCategory {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Long id;

@Column(name="name")
private String name;

@OneToMany(fetch=FetchType.LAZY, mappedBy="category")
private Set<Product> products = new HashSet<Product>(0);

// getters() & setters()

}

我将Spring Boot与Thymeleaf结合使用,以创建通常的CRUD操作所需的表单。

这是我的html页面的基本部分,用于将新Product对象添加到数据库中。

<form action="#" th:action="/product/save" th:object="${newProduct}" method="POST">
  <input type="text" th:field="*{name}" />
  <input type="text" th:field="*{description}" />
  <select th:field="*{category}">
    <option th:each="category: ${productCategories}" th:value="${category}" th:text="${category.name}" />
  </select>
  <button type="submit">Submit</button>
</form>

问题是,当我尝试Product从控制器中插入结果对象时(我知道我没有在这里显示它,主要是因为我认为这实际上并不是问题的原因),

MySQLIntegrityConstraintViolationException: Column 'category_id' cannot be null

我曾试图改变valueoption${category.id},但即使这样仍不能解决问题。

简而言之

我实际上如何使用Thymeleaf将复杂的对象作为POST参数传递给控制器​​?

更新

与我的最初想法相反,这实际上可能与我有关Controller,所以这是我的ProductController

@RequestMapping(value="/product/save", method=RequestMethod.POST)
public String saveProduct(@Valid @ModelAttribute("newProduct") Product product, ModelMap model) {
    productRepo.save(product);
    model.addAttribute("productCategories", productCategoryRepo.findAll());
    return "admin-home";
}

@RequestMapping(value="/product/save")
public String addProduct(ModelMap model) {
    model.addAttribute("newProduct", new Product());
    model.addAttribute("productCategories", productCategoryRepo.findAll());
    return "add-product";
}
法拉吉·法鲁克(Faraj Farook)

请注意,我已将form方法更改为POST。

从百里香的角度来看,我可以确保以下代码可以正常工作。

<form method="POST" th:action="@{/product/save}" th:object="${newProduct}">
    ....
    <select th:field="*{category}" class="form-control">
       <option th:each="category: ${productCategories}" th:value="${category.id}" th:text="${category.name}"></option>
    </select>

只要您的控制器看起来像这样。

@RequestMapping(value = "/product/save")
public String create(Model model) {
    model.addAttribute("productCategories", productCategoryService.findAll());
    model.addAttribute("newproduct", new Product()); //or try to fetch an existing object
    return '<your view path>';
}

@RequestMapping(value = "/product/save", method = RequestMethod.POST)
public String create(Model model, @Valid @ModelAttribute("newProduct") Product newProduct, BindingResult result) {
    if(result.hasErrors()){
        //error handling  
        ....
    }else {
        //or calling the repository to save the newProduct
        productService.save(newProduct);
        ....
    }
}

更新

您的模型应该具有正确的具有正确名称的吸气剂和吸气剂。例如,对于category您应该拥有的属性

public ProductCategory getCategory(){
    return category;
}

public void setCategory(productCategory category){
    this.category = category;
}

注意-我尚未编译此代码,我从当前的工作项目中提取了该代码,并将其名称替换为您的类名称

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有一对多/多对一关系的POJO数据(JDBC)

来自分类Dev

具有一对多/多对一关系的POJO数据(JDBC)

来自分类Dev

需要使用awk在具有多对一关系的两列的基础上过滤数据

来自分类Dev

根据该关系从具有一对多和多对一关系的表中查询数据

来自分类Dev

在Postgresql中创建具有多对一关系的表

来自分类Dev

如何正确连接具有多对一关系的表

来自分类Dev

如何使用休眠Lucene搜索具有多对一关系的实体

来自分类Dev

使用HSQL检索数据-多对一关系

来自分类Dev

使用HSQL检索数据-多对一关系

来自分类Dev

具有两个多对一关系的实体关系

来自分类Dev

按日期获取具有多对一关系的多个表的最后一条记录

来自分类Dev

Django查询多对一关系,如何检索数据多对一关系

来自分类Dev

EF代码优先:具有多个多对一关系的实体类型

来自分类Dev

symfony3:为具有多对一关系的列的实体创建表单

来自分类Dev

保存具有多对一关系的Django ORM对象时出现问题

来自分类Dev

Symfony主义查询生成器查找具有多对一关系的实体

来自分类Dev

为具有多对一关系的列保存对象时出错

来自分类Dev

为具有多对一关系的列保存对象时出错

来自分类Dev

Zend2-Doctrine2:创建具有多对一关系的新实体

来自分类Dev

EF代码优先:具有多个多对一关系的实体类型

来自分类Dev

Ruby on Rails中具有多对一关系的模型中的“显示”和“索引”路由问题

来自分类Dev

有没有一种方法可以简化具有多对一关系的Linq查询?

来自分类Dev

有没有一种方法可以简化具有多对一关系的Linq查询?

来自分类Dev

多对一关系laravel

来自分类Dev

Laravel 多对一关系

来自分类Dev

LINQ检索多对一关系数据库

来自分类Dev

与用户数据库的多对一关系

来自分类Dev

如何使用Hibernate保存具有一对一关系的两个类?

来自分类Dev

使用现有模型在 Django 中创建多对一关系

Related 相关文章

  1. 1

    具有一对多/多对一关系的POJO数据(JDBC)

  2. 2

    具有一对多/多对一关系的POJO数据(JDBC)

  3. 3

    需要使用awk在具有多对一关系的两列的基础上过滤数据

  4. 4

    根据该关系从具有一对多和多对一关系的表中查询数据

  5. 5

    在Postgresql中创建具有多对一关系的表

  6. 6

    如何正确连接具有多对一关系的表

  7. 7

    如何使用休眠Lucene搜索具有多对一关系的实体

  8. 8

    使用HSQL检索数据-多对一关系

  9. 9

    使用HSQL检索数据-多对一关系

  10. 10

    具有两个多对一关系的实体关系

  11. 11

    按日期获取具有多对一关系的多个表的最后一条记录

  12. 12

    Django查询多对一关系,如何检索数据多对一关系

  13. 13

    EF代码优先:具有多个多对一关系的实体类型

  14. 14

    symfony3:为具有多对一关系的列的实体创建表单

  15. 15

    保存具有多对一关系的Django ORM对象时出现问题

  16. 16

    Symfony主义查询生成器查找具有多对一关系的实体

  17. 17

    为具有多对一关系的列保存对象时出错

  18. 18

    为具有多对一关系的列保存对象时出错

  19. 19

    Zend2-Doctrine2:创建具有多对一关系的新实体

  20. 20

    EF代码优先:具有多个多对一关系的实体类型

  21. 21

    Ruby on Rails中具有多对一关系的模型中的“显示”和“索引”路由问题

  22. 22

    有没有一种方法可以简化具有多对一关系的Linq查询?

  23. 23

    有没有一种方法可以简化具有多对一关系的Linq查询?

  24. 24

    多对一关系laravel

  25. 25

    Laravel 多对一关系

  26. 26

    LINQ检索多对一关系数据库

  27. 27

    与用户数据库的多对一关系

  28. 28

    如何使用Hibernate保存具有一对一关系的两个类?

  29. 29

    使用现有模型在 Django 中创建多对一关系

热门标签

归档