【问题标题】:Problem updating collection using JPA使用 JPA 更新集合时出现问题
【发布时间】:2010-03-12 18:44:04
【问题描述】:

我有一个包含Collection<Bar> bars 的实体类Foo foo。我尝试了多种方法,但无法成功更新我的收藏。

一次尝试:

foo = em.find(key);
foo.getBars().clear();
foo.setBars(bars);
em.flush;  \\ commit, etc.

这会将新集合附加到旧集合。

另一个尝试:

foo = em.find(key);
bars = foo.getBars();
for (Bar bar : bars) {
    em.remove(bar);
}
em.flush;  

此时,我以为可以添加新的集合,但发现实体 foo 已被清除。

这里有一些注释。 在Foo:

@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "foo")
private List<Bar> bars;

在酒吧:

@ManyToOne(optional = false, cascade = { CascadeType.ALL })
@JoinColumn(name = "FOO_ID")
private Foo foo;

还有其他人遇到过这个问题吗?有什么想法吗?

【问题讨论】:

    标签: java hibernate jpa jakarta-ee persistence


    【解决方案1】:

    如果您从private Foo foo 中删除CascadeType.ALL 并在删除Bars 后调用foo.getBars().clear(),则第二种方法将起作用。

    目前,当您在第二种方法中删除 Bars 时,删除会传播到相应的 Foo 实体,因为 CascadeType.ALL 包含 CascadeType.REMOVE

    【讨论】:

    • 当我尝试这样做时,我得到:javax.persistence.EntityNotFoundException: deleted entity passed to persist: [com.Bar#&lt;null&gt;]
    • @FarmBoy:您还应该在删除Bars 后调用foo.getBars().clear()
    猜你喜欢
    • 2012-05-16
    • 2011-08-10
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多