Как я могу заполнить две сущности данными после того, как я нажму кнопку отправить - PullRequest
0 голосов
/ 17 октября 2018

Я ищу решение весь день, но все равно ничего не могу найти.

Когда я создаю книгу, как я могу создать автора и одновременно назначить его книге?

У меня есть две сущности

Книга

@Data
@Entity
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;

@ManyToOne
private Author author;
}

Автор

@Data
@Entity
public class Author {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;

@OneToMany(mappedBy = "author")
private Set<Book> books;
}

Контроллер

@Controller
public class BookController {

private BookRepository bookRepository;

public BookController(BookRepository bookRepository) {
    this.bookRepository = bookRepository;
}

@RequestMapping(value="/booklist", method= RequestMethod.GET)
public String bookList(Model model) {
    model.addAttribute("books", bookRepository.findAll());
    return "booklist";
}

@RequestMapping(value = "/add")
public String addBook(Model model){
    model.addAttribute("book", new Book());
    return "addbook";
}

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(Book book){
    bookRepository.save(book);        
    return "redirect:booklist";
}
}

ПРОСМОТР

<body>

<div>
    <form th:object="${book}" th:action="@{save}" action="#" method="post">
        <label for="title">Title</label> 
        <input type="text" id="title"
            th:field="*{title}" />
        <label for="author">Author</label>
        <input type="text" id="author" th:field="*{author.name}" />

        <input type="submit" value="Save"></input>
    </form>
</div>


</body>

При попытке создать книгу я получил эту ошибку
Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500).org.hibernate.TransientPropertyValueException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом

После того, как я нажму кнопку подтверждения , он должен выглядеть следующим образом

1 Ответ

0 голосов
/ 17 октября 2018

Попробуйте добавить cascede к Author в сущности, подобной этой

@Data
@Entity
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;

@ManyToOne(cascade=CascadeType.ALL)
private Author author;

}

, или используйте предварительную аннотацию для вашей сущности

@PrePersist
protected void onCreate() {
    //check author is exist if not persist the author first
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...