私は一日中解決策を探していますが、それでも何も見つかりません。
本を作成するときに、著者を作成して同時に本に割り当てるにはどうすればよいですか?
私は2つのエンティティを持っています
本
@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>
ブックを作成しようとすると、このエラー
が発生しました。予期しないエラーが発生しました(type = Internal Server Error、status = 500)。org.hibernate.TransientPropertyValueException:オブジェクトは保存されていない一時インスタンスを参照します-フラッシュする前に一時インスタンスを保存します
送信ボタンをクリックすると、次のようになります。
このようなエンティティの作成者にcascedeを追加してみてください
@Data
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne(cascade=CascadeType.ALL)
private Author author;
}
またはエンティティにprepersistアノテーションを使用します
@PrePersist
protected void onCreate() {
//check author is exist if not persist the author first
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加