Spring JPA:OneToMany List更新结果重复项

时间:2018-11-14 06:44:19

标签: java spring jpa spring-data-jpa

我有下面的JPA表。我已经使用了单向OneToMany关系。

@Entity
@Table(name = "xxx")
public class Parent {
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
   @JoinColumn(name = "Child_ID")
   private Set<Child1> child;

   //getter setters

}

@Entity
@Table(name = "xxx")
public class Child {
   //other colmns

   //getter setters

}

当我第一次将条目添加到上述父Set(例如20)和save()时,它成功保存到数据库。 然后在同一组中,我又添加了10个并称为保存方法。它将10个新的保存到db。如果再次调用保存,则再次将相同的10添加到数据库中,从而创建重复的条目。

Parentrepository.save(parentObject);

3 个答案:

答案 0 :(得分:0)

只需在子实体中生成有效的主键,即

@Id
@Column(name = "child_name")
private String name;

并覆盖@Equals和@HashCode方法:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Child )) return false;
    return name != null && name.equals(((Child) o).name);
}
@Override
public int hashCode() {
    return Objects.hashCode(this);
}

答案 1 :(得分:0)

我发现了问题。 Jpa存储库将保存对象并返回更新的对象。

    <S extends T> S save(S var1);

实体对象应该是不可变的(我以为如此)。这意味着它将在保存操作后更新值(在这种情况下为序列号)。但是保存操作后,它尚未更新同一对象中的序列号。当我使用返回的对象时,它起作用了。下面是更改的代码。

    parentObject = Parentrepository.save(parentObject);

答案 2 :(得分:0)

根据代码 Parent 类与 Child 类具有一对多映射。
每次打电话时
Parentrepository.save(parentObject);
确保您已正确设置以下行

parentObject.setChild(SetOfChildObjects);

还覆盖 Child

中的等于和hashCode

如果设置不正确,那么数据库中的表将得到相应的更新。

注意:为了更好的分析,您可以共享实际代码吗?