delete语句与dbo.interests中的引用约束冲突

fnatzsnv  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(373)

从数据库中删除相关实体时遇到问题。我有一个交易应用程序,用户可以张贴交易和表达他们的兴趣在其他人的交易。
当用户删除他们的帐户时,该用户所发布的所有交易和表达的兴趣都应从数据库中删除。然而,后者似乎不起作用(我也不确定第一个是否起作用,因为我不知道它们是按什么顺序被执行的)。我得到一个错误:
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() {

    }
}

有人知道我做错了什么吗?提前谢谢

1qczuiv0

1qczuiv01#

尝试设置 orphanRemovaltrue 对于以下关联:

@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<>();

如文件所述:
如果子实体生命周期绑定到它所属的父实体,这样子实体就不能没有父实体而存在,那么我们可以用 orphanRemoval 属性并取消关联子表也将触发实际子表行上的delete语句。
请注意,您不应该使用 cascade=CascadeType.ALL 对于 @ManyToMany 文件中解释的关联:
为了 @ManyToMany 协会 REMOVE 实体状态转换被级联是没有意义的,因为它将传播到链接表之外。由于另一侧可能被父一侧的其他实体引用,因此自动删除可能会以 ConstraintViolationException .

相关问题