Весна, 1 форма, 2 объекта - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу сохранить 2 x entity, author и book из одной формы. Как я могу это сделать?

Я знаю, что сначала должен сохранить автора, но я не знаю как. Author находится в отношениях один-ко-многим с book.

Я установил cascadetype.ALL. Я использую тимелист.

<form th:object="${book}" th:action="@{/book/}" method="post">
    <input type="hidden" class="form-control" th:field="*{id}"/>
    <label>title</label>
    <input type="text" class="form-control" th:field="*{title}"/>
    <label>isbn</label>
    <input type="text" class="form-control" th:field="*{isbn}"/>
    <label>description</label>
    <input type="text" class="form-control" th:field="*{description}"/>
    <label>cat</label>
    <ul>
        <li th:each="category : ${book.getCategorySet()}" th:text="category.getCategory()"></li>
    </ul>
    <label>author</label>
    <input type="text" class="form-control" th:field="*{author.name}"/>

    <input type="submit" value="Submit" />
    <input type="reset" value="Reset" />
</form>

authorCommand

@Setter
@Getter
@NoArgsConstructor
public class AuthorCommand {
    private long id;
    private String name;
    private String lastName;
    private Set<BookCommand> bookCommandSet = new HashSet<>();
}

bookCommand

@Setter
@Getter
@NoArgsConstructor
public class BookCommand {
    private long id;
    private String title;
    private String isbn;
    private String description;
    private Set<CategoryCommand> categorySet = new HashSet<>();
    private AuthorCommand author;
}

BookController

@RequestMapping(value = "book/new", method = RequestMethod.GET)
public String newBook(Model model){
    model.addAttribute("book", new BookCommand());
    return "book/form";
}

@RequestMapping(value = "book", method = RequestMethod.POST)
public String saveOrUpdate(@ModelAttribute("book") BookCommand bookCommand){
    BookCommand savedBook = bookService.saveBookCommand(bookCommand);
    return "redirect:/book/show/"+savedBook.getId();
}

1 Ответ

0 голосов
/ 19 ноября 2018

Ну, вы всегда можете отправить дополнительные параметры помимо вашей модели, используя тег name в своих входных данных.

HTML

<form th:object="${book}" th:action="@{/book/}" method="post">
    <input type="hidden" class="form-control" th:field="*{id}"/>
    <label>title</label>
    <input type="text" class="form-control" th:field="*{title}"/>
    <label>isbn</label>
    <input type="text" class="form-control" th:field="*{isbn}"/>
    <label>description</label>
    <input type="text" class="form-control" th:field="*{description}"/>
    <label>cat</label>
    <ul>
        <li th:each="category : ${book.getCategorySet()}" th:text="category.getCategory()"></li>
    </ul>
    <label>author</label>
    <input type="text" class="form-control" name="author"/>
    <input type="submit" value="Submit" />
    <input type="reset" value="Reset" />
</form>

Контроллер

@RequestMapping(value = "book", method = RequestMethod.POST)
public String saveOrUpdate(@ModelAttribute("book") BookCommand bookCommand,
                           @RequestParam("author") String name,
                           BindingResult bindingResult){
    if( bindingResult.hasErrors()) {
        return "redirect:/book/new";
    }

    Author author = new Author();
    author.setName(name);
    authorService.saveAuthor(author);
    savedBook.setAuthor(author);
    BookCommand savedBook = bookService.saveBookCommand(bookCommand);
    return "redirect:/book/show/"+savedBook.getId();
}

Несколько вещей для рассмотрения, я не знаю, как вы разделяете имя автора, но я бы добавил два разных ввода, один для имени и другой дляФамилия.Кроме того, я предполагаю, что идентификатор автора использует @GeneratedValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...