Spring MVC & Thymeleaf - коллекция дочерних объектов, потерянных после запроса POST - PullRequest
0 голосов
/ 07 мая 2019

Я использую 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...