有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    问题发生在这里Set添加一个对象,该对象将检查该对象是否存在于集合中。但是在您的例子中,由于creationTimestamp,对象b总是与现有对象不同creationTimestamp将与现有对象不同。因为您创建了新对象,所以时间将是当前数据时间。所以bs.add(b)总是true

    尝试删除creationTimestamp并重新运行代码以验证这一点

    需要重写B的equals()和hashCode()