当我删除父对象(不拥有父对象)时,它也删除了另一个表中的行,尽管它可能仍然被第一个表中的另一个实体引用。我只想删除第一个表中的实体,当然还要删除多对多连接表中的实体。我有两侧的所有级联设置,否则我得到错误,说它仍然被外键引用。我希望我很清楚。
第一张桌子Foo:
@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;
}
...
第二个表栏:
@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实例。
这两个表的映射表没有主键,这可能是个问题吗?
答案 0 :(得分:0)
删除Foo时,必须将其从相应的栏中删除,否则会出现异常。使用cascade = all你要求与Foo一起删除引用的Bars,这样你就会丢失另一个内容。
所以,在删除foo之前,你必须这样做:
for (Bar b: foo.getBars()) b.getFoos().remove(foo);
EM.remove(foo);