许多人总是删除两个表上的行

时间:2015-03-23 17:10:19

标签: java hibernate jpa cascading-deletes

当我删除父对象(不拥有父对象)时,它也删除了另一个表中的行,尽管它可能仍然被第一个表中的另一个实体引用。我只想删除第一个表中的实体,当然还要删除多对多连接表中的实体。我有两侧的所有级联设置,否则我得到错误,说它仍然被外键引用。我希望我很清楚。

第一张桌子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实例。

这两个表的映射表没有主键,这可能是个问题吗?

1 个答案:

答案 0 :(得分:0)

删除Foo时,必须将其从相应的栏中删除,否则会出现异常。使用cascade = all你要求与Foo一起删除引用的Bars,这样你就会丢失另一个内容。

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

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