Я немного в отчаянии, потому что предполагаю, что делаю что-то не так, но не могу найти, что это такое. Я искал ответ, но ни один из них не может его решить.
У меня есть 2 объекта с отношением многие ко многим, но когда я пытаюсь добавить элемент к одному из них, это невозможно. Скорее всего, он не добавляется в БД.
Один из них имеет идентификатор Formador, а другой - Proveedor. Просто хочу назначить один (или больше) элементов Proveedor для Formador (formador.proveedores)
Это следующие сущности:
Formador (только связь и конструктор)
@ManyToMany (mappedBy = "formadores")
private List <Proveedor> proveedores;
//CONSTRUCTORES
public Formador() {}
public Formador(Long idFormador, String nifFormador, String passFormador, String nombreFormador, String ap1Formador,
String ap2Formador, String direccionFormador, int cpFormador, String localidadFormador,
String provinciaFormador, String tel1Formador, String tel2Formador, String mail1Formador,
String mail2Formador, String cuentaBancariaFormador, List<Visita> visitas, List<Zona> zonas, Rol rol,
List<Formacion> formaciones, List<Comercial> comerciales, List<Proveedor> proveedores)
Proveedor (тот же)
@ManyToMany (fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "formadores_proveedores",
joinColumns = @JoinColumn(name = "id_proveedor"),
inverseJoinColumns = @JoinColumn(name = "id_formador"))
private List <Formador> formadores;
//CONSTRUCTORES
public Proveedor() {}
public Proveedor(Long idProveedor, String nombreProveedor, List<Campagna> campagnas, List<Franquicia> franquicias,
List<Zona> zonas, List<Tienda> tiendas, List<Formacion> formaciones, List<Formador> formadores)
Контроллер Formador
@GetMapping("/formadorAsignaProveedor/{idFormador}")
public String asignarProveedorFormador(@PathVariable("idFormador") Long idFormador, Model model) {
Formador formador = null;
if (idFormador != null) {
formador = formadorService.findOneFormador(idFormador);
}
else{
return "redirect:/index";
}
Proveedor proveedor = new Proveedor();
List <Proveedor> listaProveedores = formadorService.findAllProveedores();
model.addAttribute("proveedores", listaProveedores);
model.addAttribute("proveedor", proveedor);
model.addAttribute("formador", formador);
return "/formadorAsignaProveedor";
}
@PostMapping("/formadorAsignaProveedor/{idFormador}")
public String formadorGuardaAsignacionProveedor (@PathVariable("idFormador") Long idFormador, Proveedor proveedor, Model model) {
Formador formador = null;
if (idFormador != null) {
formador = formadorService.findOneFormador(idFormador);
}
else{
return "redirect:/index";
}
formador.getProveedores().add(proveedor);
formadorService.saveFormador(formador);
model.addAttribute("formador", formador);
return "redirect:/formadorVer/" + idFormador;
}
Интернет:
<form th:action="@{/formadorAsignaProveedor/} + ${formador.idFormador}"
th:object="${proveedor}" th:method="POST">
<div class="form-row mt-2">
<div class="col-4 mt-2">
<select id="proveedorFormador" class="form-control"
th:field="*{idProveedor}">
<option th:each="proveedor:${proveedores}"
th:text="${proveedor.nombreProveedor}"
th:value="${proveedor.idProveedor}"></option>
</select>
</div>
</div>
<div class="form-row mt-2">
<div class="col-4 mt-2">
<input type="submit" class="btn btn-success" value="Asignar">
</div>
</div>
</form>
Заранее благодарим за вашу помощь!
РЕШЕНИЕ:
Решение не было для меня очевидным: поскольку я работал с сущностью Formador (в которой я вносил изменения), я назвал ее владельцем отношения.
Итак, я меняю модель следующим образом:
Formador
@ManyToMany (fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "formadores_proveedores",
joinColumns = @JoinColumn(name = "id_formador"),
inverseJoinColumns = @JoinColumn(name = "id_proveedor"))
private List <Proveedor> proveedores;
Proveedor
@ManyToMany (mappedBy = "proveedores")
private List <Formador> formadores;
Всем спасибо!