Невозможно сохранить данные в объекте сопоставления «многие ко многим» - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть 2 сущности - Book и Publisher, которые имеют отношение многие ко многим. Помимо идентификаторов этих сущностей в сущности сопоставления, я хочу сохранить дополнительный атрибут, такой как bookFormat. Поэтому я создал объект сопоставления BookPublisher и объект составного ключа BookPublisherId. Теперь, когда я хочу сохранить данные, используя JSON данные с моего контроллера покоя, я не могу сохранить данные правильно. В моих JSON данных я передаю следующее:

{
    "name": "Book14",
    "authors": [
        {
            "firstName": "book14FirstName",
            "lastName": "book14LastName"
        }
    ],
    "publishers": [
        {
            "publisher": {
                "name": "Pearson1"
            },
            "format": "Paperback"
        }   
    ]
}

Вот сущность Book:

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotNull
    private String name;

    @ManyToMany(cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Author> authors;

    @OneToMany(mappedBy = "book")
    private List<Review> reviews;

    @OneToMany(mappedBy = "book")
    private Set<BookPublisher> publishers;


    public Book() {

    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Review> getReviews() {
        return reviews;
    }

    public void setReviews(List<Review> reviews) {
        this.reviews = reviews;
    }

    public Set<Author> getAuthors() {
        return authors;
    }

    public void setAuthors(Set<Author> authors) {
        this.authors = authors;
    }

    public Set<BookPublisher> getPublishers() {
        return publishers;
    }

    public void setPublishers(Set<BookPublisher> publishers) {
        this.publishers = publishers;
    }

}

Вот сущность Publisher:

@Entity
public class Publisher {

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

    @OneToMany(mappedBy = "publisher")
    private Set<BookPublisher> publishedBooks;

    public Publisher() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<BookPublisher> getPublishedBooks() {
        return publishedBooks;
    }

    public void setPublishedBooks(Set<BookPublisher> publishedBooks) {
        this.publishedBooks = publishedBooks;
    }
}

Вот сущность BookPublisher:

@Entity
public class BookPublisher {

    @EmbeddedId
    private BookPublisherId bookPublisherId;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("bookId")
    private Book book;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("publisherId")
    private Publisher publisher;

    private String format;

    public BookPublisher() {
    }

    public BookPublisher(Book book, Publisher publisher, String format) {
        this.book = book;
        this.publisher = publisher;
        this.format = format;
    }

    public BookPublisherId getBookPublisherId() {
        return bookPublisherId;
    }

    public void setBookPublisherId(BookPublisherId bookPublisherId) {
        this.bookPublisherId = bookPublisherId;
    }

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public Publisher getPublisher() {
        return publisher;
    }

    public void setPublisher(Publisher publisher) {
        this.publisher = publisher;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }
}

Вот код, в котором я пытаюсь сохранить сущность Book, полученную в контроллере остального:

 public Book addBook(Book book) {
        Set<BookPublisher> toAddPublishers = new HashSet<>();
        for(BookPublisher publisher : publishers) {
            Publisher addedPublisher = publisherRepository.save(publisher.getPublisher());
            BookPublisher toAddBookPublisher = bookPublisherRepository.save(new BookPublisher(book, addedPublisher, publisher.getFormat()));
            toAddPublishers.add(toAddBookPublisher);
        }
        book.setPublishers(toAddPublishers);
        Book addedBook = bookRepository.save(book);
        return addedBook;
    }

Когда я пытаюсь вызвать этот метод, я вижу, что сущность BookPublisher не сохраняется в базе данных. Как правильно добавить такие данные?

1 Ответ

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

Я не могу сказать ничего определенного по внешнему виду вашего кода, но находится ли ваш addBook в области транзакций? Кроме того, почему вы не установили никаких каскадов для ваших отношений?

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