У меня есть вариант использования, у Книги есть одна Категория, и Категория может принадлежать большому количеству Книг. Одна книга может принадлежать нескольким авторам, а автор - нескольким. Итак, вот их отношения:
Book
до BookCategory
=> many-to-one
BookCategory
до Book
=> one-to-many
Book
до Author
и Author
до Book
=> many-to-many
Итак, у меня 4 таблицы:
book
book_category
author
book_author
(book_id
, author_id
)
Корпус:
- если я удалю
Book
, с таблицей book_category
- Если я удаляю
Book
, Author
следует удалить, если Author
больше не принадлежит ни одному books
. Например, у меня есть book1
и book2
с таким же Author
именем John
. Если я удалю book1
, он не удалит John
. Но если я также удалю book2
, то John
будет удален из таблицы Author
. Кроме того, любое удаление книги повлияет на таблицу book_author
.
вот как я объявляю сущность
Автор
@Entity(name = "author")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "address", nullable = false)
private String address;
@ManyToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonBackReference
private Set<Book> book;
}
Книга
@Entity(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "year", nullable = false)
private String year;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "book_author",
joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "author_id", referencedColumnName = "id"))
@JsonManagedReference
private Set<Author> author;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "category_id", referencedColumnName = "id", nullable = false)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private BookCategory category;
}
Категория книги
@Entity(name = "book_category")
public class BookCategory {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "category", nullable = false)
private String category;
}
и вот как я пытаюсь удалить книгу. Просто простой метод. Но после того, как я запустил это, он показывает ошибку с именем org.postgresql.util.PSQLException: ERROR: update or delete on table "book_category" violates foreign key constraint "fk5jgwecmfn1vyn9jtld3o64v4x" on table "book"
, что похоже на то, что метод пытается также удалить таблицу book_category
.
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public ResponseEntity<?> delete(@PathVariable(value = "id") Long id) throws Exception {
try {
bookService.deleteById(id);
return ResponseEntity.ok().body("delete done");
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
Тогда как этого добиться? Любая подсказка, пожалуйста?