我有下面的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);
答案 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如果设置不正确,那么数据库中的表将得到相应的更新。
注意:为了更好的分析,您可以共享实际代码吗?