从数据库中删除相关实体时遇到问题。我有一个交易应用程序,用户可以张贴交易和表达他们的兴趣在其他人的交易。
当用户删除他们的帐户时,该用户所发布的所有交易和表达的兴趣都应从数据库中删除。然而,后者似乎不起作用(我也不确定第一个是否起作用,因为我不知道它们是按什么顺序被执行的)。我得到一个错误:
delete语句与引用约束“fkq9kr60l7n7h3yf82s44rkoe4g”冲突。冲突发生在数据库“dbi438161\u i438161”、表“dbo.interests”、列“user\u id”中。
注意:当我试图删除一笔交易时,我得到了相同的结果,但是列是'trade\u id'
我对用户的交易和角色也这么做,所以我认为这与我感兴趣的实体有关。我正在使用cascadetype.all注解让hibernate删除相关实体
用户中的相关实体列表:
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name="user_roles",
joinColumns = { @JoinColumn(name = "user_id") },
inverseJoinColumns = { @JoinColumn(name = "role_id") })
private List<Role> roles = new ArrayList<>();
@Transient
@JsonIgnore
@OneToMany(cascade=CascadeType.ALL, mappedBy="user")
private List<Interest> interests = new ArrayList<>();
@Transient
@JsonIgnore
@OneToMany(cascade=CascadeType.ALL, mappedBy="user")
private List<Trade> trades = new ArrayList<>();
利益实体:
@Entity
@Table(name = "interests")
public class Interest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int interestId;
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
@ManyToOne
@JoinColumn(name = "trade_id", nullable = false)
private Trade trade;
private String comment;
public Interest(User user, Trade trade, String comment) {
this.user = user;
this.trade = trade;
this.comment = comment;
}
public Interest(){
}
}
作为比较,贸易实体:
@Entity
@Table(name = "trades")
public class Trade {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="trade_id")
private int tradeId;
@Column(name="wants")
private String wants;
@Column(name="offers")
private String offers;
@Column(name="date_last_modified")
private LocalDateTime lastModified;
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
@Transient
@JsonIgnore
@OneToMany(cascade=CascadeType.ALL, mappedBy="trade")
private List<Interest> interests = new ArrayList<>();
public Trade(String wants, String offers, User user){
this.wants = wants;
this.offers = offers;
this.user = user;
}
public Trade() {
}
}
有人知道我做错了什么吗?提前谢谢
1条答案
按热度按时间1qczuiv01#
尝试设置
orphanRemoval
至true
对于以下关联:如文件所述:
如果子实体生命周期绑定到它所属的父实体,这样子实体就不能没有父实体而存在,那么我们可以用
orphanRemoval
属性并取消关联子表也将触发实际子表行上的delete语句。请注意,您不应该使用
cascade=CascadeType.ALL
对于@ManyToMany
文件中解释的关联:为了
@ManyToMany
协会REMOVE
实体状态转换被级联是没有意义的,因为它将传播到链接表之外。由于另一侧可能被父一侧的其他实体引用,因此自动删除可能会以ConstraintViolationException
.