使用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 products = new HashSet(0); // getters() & setters() } 

我正在使用Thymeleaf的Spring启动来为通常的CRUD操作创建必要的表单。

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

 

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

 MySQLIntegrityConstraintViolationException: Column 'category_id' cannot be null 

我已经尝试将optionvalue更改为${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"; } 

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

从百里香的角度来看,我可以保证下面的代码应该有效。

 
....

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

 @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 ''; } @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); .... } } 

更新

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

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

注意我没有编译这段代码,我从当前的工作项目中提取它并用你的类名替换名称