Проблема с удалением сущности из реляционной базы данных - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь написать метод, который удалял бы сущность из таблицы book, которая имеет отношение к сущностям из таблицы comments. Идея состоит в том, чтобы удалить все записи в comments при удалении записи в book.

Может кто-нибудь помочь мне с этим? Я не знаю, что не так, это удаляет комментарии правильно, но тогда происходит ошибка. Метод от службы, ответственной за удаление, классы и сообщения от Spring ниже. Cheers

Ошибка выглядит следующим образом:

Servlet.service () для сервлета [dispatcherServlet] в контексте с исключением пути [] выбросило [Ошибка обработки запроса; Вложенное исключение - org.springframework.orm.jpa.JpaObjectRetrievalFailureException: невозможно найти birski.bookstore.models.Comment с идентификатором 1; вложенное исключение: javax.persistence.EntityNotFoundException: невозможно найти birski.bookstore.models.

Комментарий с идентификатором 1] с root причиной

Метод из службы, отвечающий за удаление объектов

    public ResponseEntity<?> deleteBookDto(String bookTitle){
        return bookRepository.findByTitle(bookTitle).map(b ->{
            for (Comment comment : b.getComments()){
                commentRepository.delete(comment);
            }
            bookRepository.delete(b);
            return new ResponseEntity<>("Book titled: " + bookTitle + " was deleted!", HttpStatus.OK);
        }).orElseThrow(()-> new ResourceNotFoundException("Book titled: " + bookTitle + " have not been found."));
    }

Книжный класс

@Entity
@Table(name = "books", schema = "public")
public class Book {

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

    @NotBlank(message = "Title is required")
    private String title;

    @NotBlank(message = "Author is required")
    private String author;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "book")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Set<Comment> comments = new HashSet<>();

    public Book() {
    }

    public Long getId() {
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Set<Comment> getComments() {
        return comments;
    }

    public void setComments(Set<Comment> comments) {
        this.comments = comments;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

Комментарий класса

@Entity
@Table(name = "comments", schema = "public")
public class Comment {

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

    @NotNull
    private String author;

    @NotNull
    private String description;

    @NotNull
    private float rating;

    @NotNull
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private Date date;

    @ManyToOne//(cascade = CascadeType.ALL)
    private Book book;

    public Comment() {
    }

    public Long getId() {
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public float getRating() {
        return rating;
    }

    public void setRating(float rating) {
        this.rating = rating;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Book getBook() {
        return book;
    }

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

1 Ответ

1 голос
/ 20 февраля 2020

У вас есть

@OneToMany(fetch = FetchType.EAGER, mappedBy = "book")
@OnDelete(action = OnDeleteAction.CASCADE)
private Set<Comment> comments = new HashSet<>();

, а также ваш код, чтобы явно delete() ваши комментарии. Когда Hibernate обрабатывает удаление книги, он пытается удалить комментарии книги, но вы уже удалили эти комментарии из базы данных. Вам нужен один или другой.

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