Есть две сущности
@Entity
@Table(name = "BOOKS")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "TITLE")
private String title;
@Column(name = "BOOK_PRICE")
private int price;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "AUTHOR_ID")
private Author author;
@Entity
@Table(name = "AUTHOR")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "YEARS")
private String years;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private Set<Book> books;
Не работает сохранение книги в бд, пишет, что поле author_id не может быть null, хотя я пытался и вручную сетать автора:
@PostMapping("/add")
public String add(@ModelAttribute("book")Book book){
Author author = new Author();
author.setName("Гоголь Н.В.");
author.setYears("1809 - 1852");
Set<Book> books = new HashSet<>();
books.add(book);
author.setBooks(books);
book.setAuthor(author);
bookService.addBook(book);
return "redirect:/home";
}
Я думаю дело в форме добавления. Но не понимаю как с неё можно отправить ещё и автора
<form name="book" action="/add" method="post">
<p>Title</p>
<input title="Title" type="text" name="title">
<p>Price</p>
<input title="Price" type="text" name="price">
<input type="submit" value="Ok">
</form>
За помощь буду благодарен
Вот что можно сказать про @ManyToOne аннотацию.
Определяет однозначную связь с другим сущностным классом, который
имеет множественную множественность. Обычно нет необходимости
указывать целевой объект явно, поскольку он обычно может быть выведен
из типа объекта, на который делается ссылка. Если отношение является
двунаправленным, сторона, не владеющая @OneToMany, должна
использовать элемент mappedBy, чтобы указать поле отношения или
свойство объекта, являющегося владельцем отношения.
Поскольку вы создаете сущьность вручную, то у нее еще нет связи и поэтому такая сущьность не представляет множественности. Для того, чтобы вывести целевой обект его не надо указывать, а нужно загрузить, тогда владеющая сторона будет учитывать тип объекта при сохранении, на который делается ссылка.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости