多对多总是删除两个表上的行

Many to many always deletes rows on both tables

当我删除一个父对象(不拥有一个)时,它也会删除另一个 table 中的行,尽管它可能仍被第一个 table 中的另一个实体引用。我只想删除第一个table中的实体,当然还有多对多连接table中的实体。我在两边都设置了 all 级联类型,否则我会报错,说它仍然被外键引用。我希望我已经足够清楚了。

第一个 table 富:

@Id
@GeneratedValue
@Column(name = "id_foo")
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "foos")
public List<Bar> getBars() {
    return bars;
}

public void setBars(List<Bar> bars) {
    this.bars= bars;
}
...

第二个 table 栏:

@Id
@GeneratedValue
@Column(name = "id_bar")
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
        name = "foo_bars",
        joinColumns = { @JoinColumn(name = "id_bar") },
        inverseJoinColumns = { @JoinColumn(name = "id_foo") })
public List<Foo> getFoos() {
    return foos;
}


public void setFoos(List<Foo> foos) {
    this.foos= foos;
}
...

然后我尝试删除一个 Foo 实例。

两个 table 的映射 table 没有主键,这会是个问题吗?

当你删除 Foo 时,你必须将它从相应的栏中分离出来,否则你会得到你的异常。使用 cascade=all 您要求与 Foo 一起删除引用的 Bars,因此您缺少其他内容。

所以,在删除 foo 之前,您必须这样做:

for (Bar b: foo.getBars()) b.getFoos().remove(foo);
EM.remove(foo);