Я использую Spring MVC, Thymeleaf и Hibernate для создания базового приложения CRUD.Я моделирую две сущности, Автор и Книгу, с отношениями «многие ко многим».Author использует HashSet для хранения книг, а Book использует HashSet для хранения авторов.
Я столкнулся с проблемой при попытке обновить автора.Когда браузер загружает «обновленную» форму с текущими данными для автора, я убедился, что данные книги автора не повреждены.Однако когда я отправляю запрос POST для этого автора, переменная Author.books каким-то образом теряет свои данные Book.Сохранение автора в базе данных на этом этапе делает потерю связи постоянной.
Я пробовал разные способы установки отношения «многие ко многим», но безрезультатно.
Автор Entity
@Entity
@Table(name="author")
public class Author {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="first_name")
private String firstName;
@Column(name="middle_name")
private String middleName;
@Column(name="last_name")
private String lastName;
@ManyToMany(fetch=FetchType.LAZY,
cascade={CascadeType.MERGE, CascadeType.PERSIST})
@JoinTable(
name="book_author",
joinColumns=@JoinColumn(name="author_id"),
inverseJoinColumns=@JoinColumn(name="book_id")
)
@OrderBy("title")
private Set<Book> books = new HashSet<>();
// constructor, getters, and setters
Book Entity
@Entity
@Table(name="book")
public class Book {
// Some fields belonging to Book
@ManyToMany(fetch=FetchType.LAZY,
cascade={CascadeType.MERGE, CascadeType.PERSIST},
mappedBy="books")
@OrderBy("lastName")
private Set<Author> authors = new HashSet<>();
// constructor, getters, and setters
Контроллер
@Controller
@RequestMapping("/authors")
public class AuthorController {
private AuthorService authorService;
@Autowired
public AuthorController(AuthorService authorService) {
this.authorService = authorService;
}
@GetMapping("/update")
public String showFormForUpdate(@RequestParam("authorID") int authorID,
Model model) {
Author author = authorService.findByID(authorID);
model.addAttribute("author", author);
model.addAttribute("action", "/authors/save");
return "/authors/author-form";
}
@PostMapping("/save")
public String saveAuthor(@ModelAttribute("author") Author author) {
// Book data is lost by this point
authorService.save(author);
return "redirect:/authors/all";
}
}
Форма автора HTML
<form th:action="@{${action}}" th:object="${author}" method="POST">
<input type="hidden" th:field="*{id}">
<label class="font-weight-bold" for="firstName">
First Name
</label>
<input type="text" th:field="*{firstName}"
class="form-control mb-4 col-4" id="firstName" required>
<label class="font-weight-bold" for="lastName">
Last Name
</label>
<input type="text" th:field="*{lastName}"
class="form-control mb-4 col-4" id="Last Name" required>
<label class="font-weight-bold" for="middleName">
Middle Name or Initial
</label>
<input type="text" th:field="*{middleName}"
class="form-control mb-4 col-4" id="middleName">
<button type="submit" class="btn btn-info">Save</button>
</form>