Mam problem z tworzeniem prawidłowego kontolera i formularz dodającego pole, które jest połaczone relacją many to many. Czyli tworzenie nowego produktu, w którym stworzę nową kategorię
Encja Produkt
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "product_id")
private Long id;
private String name;
private BigDecimal price;
@ManyToMany(cascade = CascadeType.ALL,mappedBy = "products")
private List<Category> categories=new ArrayList<>();
}
Encja Kategoria
@Table(name = "categories")
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "category_id")
private Long id;
private String name;
private String description;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "join_category_product", joinColumns = {@JoinColumn(name = "category_id", referencedColumnName = "category_id")},
inverseJoinColumns = {@JoinColumn(name = "product_id", referencedColumnName = "product_id")})
private List<Product> products=new ArrayList<>();}```
Kontroler
@GetMapping("/add")
public String add(Model model) {
model.addAttribute("category", new Category());
model.addAttribute("product", new Product());
return "addProduct";
}
@PostMapping("/add")
public String add(Model model,
@Valid @ModelAttribute("product") Product product,
Category category,BindingResult result ) {
product.getCategories().add(category);
category.getProducts().add(product);
repository.save(product);
return "addProduct";
}
Widok/Formularz
form class="form-horizontal" th:action="@{/product/add}" method="post" th:object="${product}">
<fieldset>
<legend class="center-block">Nowy produkt informacje</legend>
<div class="form-group">
<label for="name">Nazwa</label>
<input type="text" class="form-control" id="name" th:field="${product.name}" required="required"
placeholder="nazwa" name="name"/>
</div>
<div class="form-group">
<label for="category">Kategoria</label>
<input type="text" class="form-control" id="category" required="required"
placeholder="kategoria" name="category_name" />
</div>
</div>