【问题标题】:The DELETE statement conflicted with the REFERENCE constraint in dbo.interestsDELETE 语句与 dbo.interests 中的 REFERENCE 约束冲突
【发布时间】:2021-03-25 23:56:23
【问题描述】:

我在从数据库中删除相关实体时遇到问题。我有一个交易应用程序,用户可以在其中发布交易并表达他们对其他人交易的兴趣。

当用户删除其帐户时,该用户发布的所有交易和表达的兴趣都应从数据库中删除。但是,后者似乎不起作用(我也不确定第一个是否起作用,因为我不知道它们以什么顺序执行)。我得到了错误:

DELETE 语句与 REFERENCE 约束“FKq9kr60l7n7h3yf82s44rkoe4g”冲突。冲突发生在数据库“dbi438161_i438161”、表“dbo.interests”、列“user_id”中。

注意:当我尝试删除交易时,我得到了同样的结果,但列是“trade_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() {

    }
}

有人知道我在这里做错了什么吗?提前致谢

【问题讨论】:

    标签: java sql-server spring-boot hibernate cascade


    【解决方案1】:

    尝试将orphanRemoval 设置为true 用于以下关联:

    @OneToMany(cascade=CascadeType.ALL, mappedBy="user", orphanRemoval = true)
    private List<Interest> interests = new ArrayList<>();
    
    @OneToMany(cascade=CascadeType.ALL, mappedBy="user", orphanRemoval = true)
    private List<Trade> trades = new ArrayList<>();
    

    正如documentation中所述:

    如果子实体生命周期绑定到其拥有的父实体,因此子实体没有父实体就无法存在,那么我们可以使用orphanRemoval 属性注释关联,并且取消关联子实体将在实际子表上触发删除语句行也是如此。

    还请注意,您不应将cascade=CascadeType.ALL 用于@ManyToMany 关联,正如documentation 中所述:

    对于@ManyToMany 关联,REMOVE 实体状态转换没有意义级联,因为它会传播到链接表之外。由于另一端可能被父端的其他实体引用,因此自动删除可能会以ConstraintViolationException 结束。

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2021-02-10
      相关资源
      最近更新 更多