Я делаю небольшой проект для универа и столкнулся с некоторыми проблемами. Я использую spring-boot, spring-data-jpa и thymeleaf.
У меня есть два класса "Fundacion" (Фонд):
@Entity
@Table (name = "fundacion")
public @Data class Fundacion
{
@Id
@Column (name = "id")
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
@Column (name = "nombre")
@NotNull
@Size(min = 1, max = 30)
private String nombre;
@Column (name = "descripcion")
@NotNull
@Size(min = 1, max = 100)
private String descripcion;
@Column (name = "presupuestoanual")
@NotNull
@Min(0)
private BigDecimal presupuestoAnual;
@Column (name = "estado")
@NotNull
private boolean estado;
@OneToMany(mappedBy="afiliadoAFundacion", cascade = CascadeType.ALL)
private Set<Servicio> servicio;
@OneToMany(mappedBy="fundacion", cascade = CascadeType.ALL)
private Set<Solicitud> solicitud;
@OneToMany(mappedBy="fundacion", cascade = CascadeType.ALL)
private Set<Empleado> empleado;
и "Servicio" (Сервис):
@Entity
@Table (name = "servicio")
public @Data class Servicio
{
@Id
@Column (name = "id")
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
@Column (name = "nombre")
@NotNull
@Size(min = 1, max = 30)
private String nombre;
@Column (name = "tipo")
@NotNull
@Size(min = 1, max = 15)
private String tipo;
@Column (name = "costo")
@NotNull
@Min(0)
private BigDecimal costo;
@Column (name = "estado")
@NotNull
private boolean estado;
@OneToMany(mappedBy="servicio", cascade = CascadeType.ALL)
private Set<DetalleSolicitud> detallesolicitud;
@ManyToOne
@JoinColumn(name="idfundacion", nullable=false)
private Fundacion afiliadoAFundacion;
}
Репозиторий Fundacion (тоже почти то же самое для Service):
@Repository
public interface IFundacionRepository extends CrudRepository<Fundacion, Long>
{
List <Fundacion> findByEstadoTrue();
}
И соответствующий метод контроллера:
@RequestMapping(path = {"/editar", "/editar/{id}"})
public String crearOActualizarServicio(Model model, @PathVariable("id") Optional<Long> id)
throws RecordNotFoundException
{
if (id.isPresent())
{
List <Fundacion> listaFundaciones = fundacionService.encontrarTodas();
if(listaFundaciones.isEmpty())
{
listaFundaciones = null;
}
model.addAttribute("fundaciones", listaFundaciones);
Servicio servicio = servicioService.encontrarPorId(id.get());
model.addAttribute("servicio", servicio);
}
else
{
List <Fundacion> listaFundaciones = fundacionService.encontrarTodas();
if(listaFundaciones.isEmpty())
{
listaFundaciones = null;
}
model.addAttribute("fundaciones", listaFundaciones);
model.addAttribute("servicio", new Servicio());
}
return "admin/formularioCrearServicio";
}
Метод для отображения формы для добавления или редактирования Сервиса.
Наконец, источник самой проблемы:
<form action="#" th:action="@{/servicio/agregar}" th:object="${servicio}" method="post">
<div class="input-field col s12">
<select th:field="*{afiliadoAFundacion}">
<option th:each="fundacion: ${fundaciones}" th:value="${fundacion.id}" th:text="${fundacion.nombre}"></option>
</select>
</div>
//More form inputs
</form>
Когда я создаю новый Сервис, форма работаеткак и ожидалось, он отображает выпадающий список со всеми доступными фондами, и когда я отправляю форму, все успешно сохраняется в базе данных.
Однако, если я хочу отредактировать какой-либо сервис, он будет рекурсивно вызыватьметод findById в ServiceRepository до его сбоя.
Это повторяющийся журнал, который повторяется:
Hibernate: select servicio0_.idfundacion as idfundac6_6_0_,
servicio0_.id as id1_6_0_,
servicio0_.id as id1_6_1_,
servicio0_.costo as costo2_6_1_,
servicio0_.estado as estado3_6_1_,
servicio0_.idfundacion as idfundac6_6_1_,
servicio0_.nombre as nombre4_6_1_,
servicio0_.tipo as tipo5_6_1_
from servicio servicio0_ where servicio0_.idfundacion=?
Должно быть что-то, чего мне не хватает, любая помощь будет признательна, спасибо.
РЕДАКТИРОВАТЬ: я пытался заменитьcing с входом и, конечно же, и findByID () для службы работает нормально.