我需要删除 User'a,但由于他有连接(订阅和订阅者),对象没有被删除,我该如何正确实现呢?
抛出的异常:
Cannot delete or update a parent row: a foreign key constraint fails (`sweater_db`.`sweater_user_subscribers`, CONSTRAINT `user_role_subscribers_subscriber_fk` FOREIGN KEY (`subscriber_id`) REFERENCES `sweater_user` (`id`))
用户
@Entity
@Table(name = "sweater_user")
public class User implements UserDetails{
private final static long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "Username should not be empty")
private String username;
@NotBlank(message = "Password should not be empty")
private String password;
@Email(message = "Email is not correct")
@NotBlank(message = "Email should not be empty")
private String email;
private String activationCode;
private boolean active;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(
name = "sweater_user_role",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
)
private Collection<Role> roles;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<Message> messages;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "sweater_user_subscribers",
joinColumns = @JoinColumn(name = "channel_id"),
inverseJoinColumns = @JoinColumn(name = "subscriber_id")
)
private Set<User> subscribers = new HashSet<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "sweater_user_subscriptions",
joinColumns = @JoinColumn(name = "subscriber_id"),
inverseJoinColumns = @JoinColumn(name = "channel_id")
)
private Set<User> subscriptions = new HashSet<>();
诅咒正确。您仍然有外键阻止您删除数据库中的记录。
如果您在特定情况下直接决定前额,那么您可以使用实体生命周期的回调。特别是,您可以使用
preRemove在删除实体实例之前生成的事件。@PreRemove您可以通过在将处理此事件的 User 模型方法前面添加注释来订阅此事件。在那里,您可以与该用户“零”连接。
评论
我想提请您注意您正在使用两个不同的表(一个用于订阅,另一个用于订阅者)。
我怀疑这是你想要的。
有些东西告诉我桌子应该是一样的,只是键的使用方式不同。
句子
在您订阅的地方,我通常会使用
Subscription带有字段的单独实体:User channel;User subscriber;在这种情况下,在相应链接上的用户中,您可以简单地记下
CASCADE_DELETE这一切。