Как сохранить сущность, имеющую связь ManyToMany с другой сущностью в JPA? - PullRequest
0 голосов
/ 10 апреля 2020

Я не могу добавить новую Книгу с существующим Жанром в SpringBoot с json в Почтальоне. Там написано 'ограничение [\ "ПЕРВИЧНЫЙ КЛЮЧ НА ПУБЛИ мой метод записи контроллера книги:

@PostMapping("/books")
    Book createBook(@RequestBody Book book){
        return this.bookRepository.save(book);
    }

В почтальоне у меня есть это:

{
    "title": "Evgenij Onegin",
    "imgurl": "https://biblioteka.msu.edu.mk/images/covers/2018/September/5bab75a75007c/821.806.jpeg",
    "description": "desctiption",
    "bookpath": "Books\\book1.pdf",
    "author": {
        "name": "Alexandar",
        "surname": "Puskin",
        "birthdate": "1799-06-05",
        "description": "Russian author",
        "location": "Russia",
        "category": {
            "name": "Romantism",
            "id": 1
        },
        "id": 1
    },
    "genres": [
        {
            "id": 1,
            "name": "Trailer"
        },
        {
            "id": 2,
            "name": "Comic"
        }
    ]
}

И ошибка, которую я получаю:

constraint [\"PRIMARY KEY ON PUBLIC.GENRE(GENRE_ID)'.

Так что похоже проблема в отношениях ManyToMany. Без добавления Genre в Book он работает отлично, но я хочу добавить его.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Вы должны были использовать CascadeType.PERSIST в обоих ваших @ManyToMany сопоставлениях для Книг и Жанров. Кроме того, books в сущности Жанр должен быть сопоставлен с коллекцией genres.

// Book entity:
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinTable(name = "book_genre",
            joinColumns = @JoinColumn(name="book_id"),
            inverseJoinColumns = @JoinColumn(name="genre_id"))
    private List<Genre> genres;

// Genre entity:
    @ManyToMany(mappedBy = "genres", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    private List<Book> books;

По: https://www.javaworld.com/article/3387643/java-persistence-with-jpa-and-hibernate-part-2-many-to-many-relationships.html

0 голосов
/ 10 апреля 2020

Вы делаете неверную ассоциацию ManyToMany. Вы определяете JoinTable на обоих концах

public class Book {
 ...
  @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE } )
  @JoinTable(name = "book_genre",
    joinColumns = @JoinColumn(name = "book_id"),
    inverseJoinColumns = @JoinColumn(name = "genre_id")
  )
  private List<Genre> genres;
 ...

}

А на другой стороне в Genre вы просто делаете это

public class Genre {
  ...
  @ManyToMany(mappedBy = "genres")
  private List<Book> books;
  ...
}

Это очень хорошая статья о Лучший способ использовать аннотацию @ManyToMany с JPA и Hibernate Это поможет вам понять сопоставления ассоциации.

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