java复制插入的可嵌入对象
我有一个Entity
包括Embeddable
对象的集合,如下所示:
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "as")
public class A {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ElementCollection
private Set<B> bs;
public B getB(String name) {
for(B b : bs)
if(b.getName().equals(name))
return b;
return null;
}
public void addB(B b) {
if(!bs.add(b))
throw new IllegalArgumentException("Duplicate ......");
}
....
}
@Embeddable
public class B {
@Column(nullable = false)
private String name;
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Date creationTimestamp;
}
我使用Spring数据加载并保存实体,如下所示:
Optional<A> a = aRepository.findById(aId);
B b = a.getB(...);
if(b == null) {
b = new B(...);
a.addB(b);
}
aRepository.save(a);
上面的代码位于一个用^{
当该方法返回时,我可以在数据库中看到3个重复的可嵌入对象,而不是一个
知道吗
编辑:
经过长时间的调试,我可以确认Hibernate只为我添加的单个实例插入一行。然而,当我从我的REST控制器返回创建的对象时,在某个时刻,Jackson对象映射程序会在将我的对象发送回客户机之前对其进行序列化,下面是剩下的两个插入。。。我以前从没见过。。。任何帮助都将不胜感激
更多信息:
最后2次插入是在SessionRepository提交会话更改时完成的,我建议使用Spring会话。如果这有帮助的话
# 1 楼答案
问题发生在这里
Set
添加一个对象,该对象将检查该对象是否存在于集合中。但是在您的例子中,由于creationTimestamp
,对象b
总是与现有对象不同creationTimestamp
将与现有对象不同。因为您创建了新对象,所以时间将是当前数据时间。所以bs.add(b)
总是true
尝试删除
creationTimestamp
并重新运行代码以验证这一点需要重写B的equals()和hashCode()