Как грамотно реализовать связь ManyToOne hiberante?

249
29 мая 2018, 00:30

Есть две сущности

@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>

За помощь буду благодарен

Answer 1

Вот что можно сказать про @ManyToOne аннотацию.

Определяет однозначную связь с другим сущностным классом, который имеет множественную множественность. Обычно нет необходимости указывать целевой объект явно, поскольку он обычно может быть выведен из типа объекта, на который делается ссылка. Если отношение является двунаправленным, сторона, не владеющая @OneToMany, должна использовать элемент mappedBy, чтобы указать поле отношения или свойство объекта, являющегося владельцем отношения.

Поскольку вы создаете сущьность вручную, то у нее еще нет связи и поэтому такая сущьность не представляет множественности. Для того, чтобы вывести целевой обект его не надо указывать, а нужно загрузить, тогда владеющая сторона будет учитывать тип объекта при сохранении, на который делается ссылка.

READ ALSO
Отключить клики айтемов RyclerView на 3 секунды

Отключить клики айтемов RyclerView на 3 секунды

Есть 4 айтема RecyclerView клик реализовал по LinerLayout, если юзер нажмет на один из айтемов, нужно чтобы в течение 3 секунд клики у всех айтемов отключились,...

216
Why I get NullPointerException? [закрыт]

Why I get NullPointerException? [закрыт]

This is my backend method:

255
Парсинг строки (Java)

Парсинг строки (Java)

Добры день! Нужно написать метод, который будет делить строку на массив строк по разделителю точка, а затем поместить разделенные строки...

277
Java nio select() не блокирует поток

Java nio select() не блокирует поток

Есть сервер (однопоточный nio) работающий с клиентами, все работает корректно кроме того, что после первого ответа клиенту метод select перестает...

227