java - 使用 JPA 更新集合时出现问题

标签 java hibernate jpa jakarta-ee persistence

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

一次尝试:

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;

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

最佳答案

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

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

关于java - 使用 JPA 更新集合时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2434985/

相关文章:

java - 检测手机 hibernate 时的手势

java - 使用多态参数覆盖方法

java - PHP Java 桥异常 - 协议(protocol)错误

java - 使用 Hibernate 将嵌套的 JSON 数据保存到 MySQL 数据库中

java - 实体管理器始终为空

Hadoop 中的 Java 代码

java - Hibernate 中的延迟加载

java - 如何将 hibernate.cfg.xml 配置为 applicationContext.xml 作为数据源?

java - 在 Java 中返回通用对象(例如列表)的更清洁的解决方案

java - 使用 hibernate-envers 时,AUD 表中的所有 @Version 字段均为 null,但在实体中 - 表已填充好吗?