JPA清除收集并添加新项目

Den*_*søe 18 java orm hibernate jpa hibernate-mapping

我有一个我想要清除的@OneToMany集合(列表),并在同一个事务中添加新元素.

运用

collection.clear();
collection.add(new EntityB());
Run Code Online (Sandbox Code Playgroud)

只需添加新实例,永远不会删除任何内容.我有orphanRemoval = true收集领域.

添加:

// Parent entity
@OneToMany(mappedBy = "product", orphanRemoval = true)
private List<Feature> features = new ArrayList<>();

// Child entity
@ManyToOne(cascade = CascadeType.ALL)
private Product product;

// Clear and add attempt
product.getFeatures().clear();

Feature feature = new Feature(product, ls);
product.getFeatures().add(feature);
Run Code Online (Sandbox Code Playgroud)

Vla*_*cea 28

您尝试仅清除双向关联的一侧.

所以代替:

collection.clear();
Run Code Online (Sandbox Code Playgroud)

本文所述,尝试清除双方,它应该工作:

for(Iterator<Feature> featureIterator = features.iterator(); 
    featureIterator.hasNext(); ) {
    Feature feature = featureIterator .next();
    feature.setProduct(null);
    featureIterator.remove();
}
Run Code Online (Sandbox Code Playgroud)

此外,从中删除级联@ManyToOne并将其移动到@OneToMany.

注意独特的限制

但是,如果您有唯一约束,则此clear + add反模式将不起作用,因为INSERT操作在DELETE操作之前执行,如本文中所述.

正确的方法是检查哪些条目需要删除,然后删除它们.然后,添加新的,并更新已修改的那些.这是您正确进行集合合并的方法.

  • 我试过了。仍然有一组新的 Feature 实例被添加到数据库中。我很惊讶让这项工作如此困难...... (2认同)
  • 应该在 OneToMany 上设置 Cascade,在 ManyToOne 一侧设置 mot。移动它,看看你是否还有这个问题。 (2认同)

Den*_*søe 3

事实证明,实际的解决方案是使用@JoinColumn 注释而不是mappedBy="" 参数。

  • 您可以自由地接受您想要的任何解决方案,但您可能不明白 `mappedBy` 的作用以及可能的含义...... (4认同)