多对多总是删除两个表上的行
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);
当我删除一个父对象(不拥有一个)时,它也会删除另一个 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);