th:href="@{findOne/(id=${tour.id})}"
Глянув на этот участок кода могу сказать следующее - не передавайте саму сущность на фронт. Вместо этого используйте паттерн DTO. Т.е. для создания / обновления используйте DTO, который затем в сервисном слое маппите в entity и сохраняете в БД,
Для маппинга можно использовать разные либы.
Например, интерфейс
Converter<S, T>
или же либу MapStruct, ModelMapper и др.
Также можно использовать
BeanUtils.copyProperties()
например, для обновления сущности.
@ResponseBody
public Tour findOne(Integer id) {
return tourRepository.findById(id).get();
}
Вместо
get()
лучше использовать например,
orElseThrow()
и выбросить исключение, которое впоследствиее можно при помощи ExceptionHandler обработать и вернуть корректный http ответ. Например, когда объект не найден (404)
@Autowired
private TourRepository tourRepository;
@PostMapping("/save")
public String save(@ModelAttribute(name = "tour") Tour tour) {
tourRepository.save(tour);
return "redirect:/";
}
@PostMapping("/admin/saveTour")
public String saveTourInModal(@ModelAttribute(name = "tour") Tour tour) {
tourRepository.save(tour);
return "redirect:/admin/tourList";
}
Нет смысла в двух одинаковых методах внутри одного контроллера. Есть смысл вынести эндпоинты отвечающие за админку в отдельный контроллер.
Само модальное окно вызывается и заполняется данными объекта. После нажатия на кнопку сохранения, у меня стало выводить исключение org.hibernate.exception.ConstraintViolationException: could not execute statement, и что поля бд title и description не могут быть null.
Вопрос в том, почему они были null, если вы делаете сабмит формы. Попробуйте глянуть в консоли браузера во вкладке "Сеть", какие именно данные отправляются в бэк. Также в режиме дебага проверьте, что именно вы принимаете и сохраняете в БД.
Обратите внимание, что на одной странице вы делаете update
Hibernate: update tour set description=?, end_time=?, image=?, price=?, start_time=?, title=? where code=?
А на другой странице insert
Hibernate: insert into tour (description, end_time, image, price, start_time, title) values (?, ?, ?, ?, ?, ?)
Для более точного ответа нужен исходник проекта, ибо я не вижу кода сущности