Я использую пружинную загрузку для моделирования своего бэкэнда, и у меня есть несколько внешних ключей в структуре моей модели.
Я не могу выполнять операции удаления в целом и операции обновления, когда затрагиваются внешние ключи. Я пробовал несколько методов, найденных на inte rnet, но, похоже, ни один из них не работает.
Через SQL (SQL команды) могут удалить объекты из book_queue_entry, copy и author_write, но не пользователя author, book и book_store из-за ограничений внешнего ключа. Поэтому я хотел бы знать, что я делаю неправильно в каждой из моих моделей / отношений, которые не работают на уровне SQL. Поскольку это не работает на уровне SQL, что-то с моим моделированием, по крайней мере, что касается настройки операций удаления в корне неверно. Я не могу указать на что.
Проблема 1: Невозможно удалить книгу: при удалении книги ее следует удалить из списка произведений автора - другими словами, удалить ее из списка авторов_write:
Автор. java:
@Entity
@Setter
@Getter
@NoArgsConstructor
public class Author extends BaseEntity implements Serializable {
//stuff
@ManyToMany(cascade = CascadeType.ALL)
@JsonIgnore
@JoinTable(
name = "authors_write",
joinColumns = @JoinColumn(name = "author_id"),
inverseJoinColumns = @JoinColumn(name = "book_id"))
Set<Book> works;
}
Книга. java
@Entity
@Setter
@Getter
@NoArgsConstructor
public class Book extends BaseEntity implements Serializable {
//stuff
@ManyToMany(mappedBy = "works", cascade = CascadeType.ALL)
@EqualsAndHashCode.Exclude
Set<Author> authors;
@JsonIgnore
@OneToMany(mappedBy = "book")
private List<BookQueueEntry> bookQueue;
}
Проблема 2: Невозможно удалить авторов. Когда автор удаляется, все записи в авторах_write с соответствующим author_id должны быть удалены. Классы такие же, как указано выше. В этом случае каскадирование также не работает.
Проблема 3: Невозможно удалить пользователей. При удалении пользователей заемщик_id в копии должен быть обнулен (я читал, что это не работает в JPA вообще), а book_queue_entries с соответствующим user_id должны быть удалены
Копия. java
@Entity
@Setter
@Getter
@NoArgsConstructor
public class Copy extends BaseEntity implements Serializable {
//stuff
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn
@EqualsAndHashCode.Exclude
private Book reference;
@ManyToOne
@JoinColumn
@EqualsAndHashCode.Exclude
private BookStoreUser borrower;
}
User. java:
public class BookStoreUser extends BaseEntity implements Serializable {
//more stuff here
@JsonIgnore
@OneToMany(mappedBy = "borrower")
private Set<Copy> booksBorrowed;
}
BookQueueEntry. java
@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
public class BookQueueEntry extends BaseEntity implements Serializable {
//more stuff here
@ManyToOne(cascade = CascadeType.ALL)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "user_id", nullable = false)
@EqualsAndHashCode.Exclude
private BookStoreUser user;
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "book_id", nullable = false)
@EqualsAndHashCode.Exclude
private Book book;
}
Еще раз, я считаю, что что-то не так с тем, как я сопоставил каскадные операции. Что-то не так в более общем смысле, и я не могу понять, что именно.
РЕДАКТИРОВАТЬ: Я должен отметить, что @OnDelete(action = OnDeleteAction.CASCADE)
у меня тоже не работал. РЕДАКТИРОВАТЬ 2: С ясной головой я смог исправить проблемы 1 и 2, используя это: https://www.youtube.com/watch?v=vYNdjtf7iAQ