java - 无法删除或更新父行:删除具有引用的实体时外键约束失败
问题描述
我想删除一个引用“Authority”实例的“UserRegistration”实例。通过存储库删除“UserRegistration”实例时,出现以下错误:“无法删除或更新父行:外键约束失败(seprojekt
. authorities
, CONSTRAINT authorities_ibfk_1
FOREIGN KEY ( userid
) REFERENCES users
( id
))”是否有可能删除删除“UserRegistration”实例时引用的实体?我在“UserRegistration”中使用 Cascadetype 和 orphanRemoval 进行了尝试,但什么也没发生。
尝试删除实体的方法:
@DeleteMapping
public boolean deleteUser(@RequestParam String username) {
Optional<UserRegistration> optUserRegistration = uRepo.findByUsername(username);
if(optUserRegistration.isPresent()) {
System.out.println("!!! Authority is: '" + optUserRegistration.get().getAuthority().getAuthority());
uRepo.delete(optUserRegistration.get());
return true;
}
return false;
}
UserRegistration 类如下所示:
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
@Entity
@Table(name = "users")
public class UserRegistration {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
@JsonIgnore
private String password;
@JsonIgnore
private boolean enabled;
private Integer profilePicture;
private String email;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "id")
private Authority authority;
@JsonManagedReference
@ManyToMany
@JoinTable(name = "userhasfavorite", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "channelid"))
private List<Channel> favorites;
public UserRegistration() {
}
public UserRegistration(String email, String username, String password, boolean enabled, int profilePicture) {
this.email = email;
this.username = username;
this.password = password;
this.enabled = enabled;
this.profilePicture = profilePicture;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean getEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public Integer getProfilePicture() {
return profilePicture;
}
public void setProfilePicture(Integer profilePicture) {
this.profilePicture = profilePicture;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Authority getAuthority() {
return authority;
}
public void setAuthority(Authority authority) {
this.authority = authority;
}
public List<Channel> getFavorites() {
return favorites;
}
public void setFavorites(List<Channel> favorites) {
this.favorites = favorites;
}
}
权威类看起来像这样:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "authorities")
public class Authority {
@Id
@Column(name = "userid")
private int userID;
private String username;
private String authority;
@OneToOne(mappedBy = "authority")
private UserRegistration user;
public Authority() {
}
public Authority(int userID, String username, String authority) {
this.userID = userID;
this.username = username;
this.authority = authority;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAuthority() {
return authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
public UserRegistration getUser() {
return user;
}
public void setUser(UserRegistration user) {
this.user = user;
}
}
非常感谢您阅读本文。如果需要,请向我询问更多详细信息。
解决方案
为了级联工作;您需要反转实体关系定义。级联仅适用于父实体到子实体。我的意思是以下。请定义authority
为UserRegistration
:
@OneToOne(mappedBy="user", cascade = CascadeType.ALL)
private Authority authority;
和userRegistration
作为Authority
:
@OneToOne
@MapsId
private UserRegistration user;
我相信这应该有效。请查看以下内容以获取更多信息。希望有帮助。
推荐阅读
- javascript - 为什么我的敌人在我的背景/瓷砖地图后面?Phaser.js
- kibana - DSL,其中 field1 等于 foo,field2 等于 bar 或 bar2
- python - 如何解决问题“错误:不支持的区域设置”
- google-cloud-logging - 日志和指标值不匹配
- c# - 从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间
- android - 任务':fluttertoast:compileReleaseKotlin'Catcher包flutter执行失败
- php - 如何在laravel中加入三个表
- jq - 以 json 格式从 shell 命令获取输出
- c# - StackedHeaderDecorator添加的多层列标题下如何添加行
- c++ - 我正在尝试使用 std::signal 干净地结束我的多线程程序,我做错了什么?