休眠尝试将同一对象持久化两次

2022-09-04 22:23:05

我有3个类对应于3个表,和。 具有 FK 到 (),并且正在使用 OneToMany 关系加入。此外,它们退出了第 4 个表,该表具有这些 和 的关系。VDPDVFK_VV_D_PVDP

以下是这些数据模型的样子:

@Entity
@Table(name = "V")                                                   
public class V {

     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     @Column(name = "ID")
     private Long id;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name = "FK_V", referencedColumnName="Id", nullable = false)
    private Set<D> d;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name = "FK_V", referencedColumnName="Id", nullable = false)
    private Set<V_D_P> vdp;

    //Getters Setters etc.
}


@Entity
@Table(name = "V_D_P")
public class V_D_P {

      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      @Column(name = "ID")
      private Long id;

     @ManyToOne(cascade=CascadeType.ALL)
     @JoinColumn(name = "FK_D", nullable = false)
     private D d;

     @ManyToOne(cascade=CascadeType.ALL)
     @JoinColumn(name = "FK_P", nullable = false)
     private P p;

     //Getters Setters etc.       
}

@Entity
@Table(name = "D")                                                   
public class D {
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      @Column(name = "ID")
      private Long id;

    //Getters Setters etc.
}

@Entity
@Table(name = "P")                                                  
public class P {

      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      @Column(name = "ID")
      private Long id;

    //Getters Setters etc.
}

现在我想坚持下去,并与他们的关系。我是VDP

V v = new V();

D d = new D();
Set<D> dSet = new HashSet<>();
dSet.add(d);
v.setD(dSet); // Adding d to V ....(1)

P p = new P();
V_D_P vdp = new V_D_P();

vdp.setD(d); // Adding d to V_D_P ....(2)
vdp.setP(p);

Set<V_D_P> vdpSet = new HashSet<V_D_P>();
vdpSet.add(vdp);
v.setVdp(vdpSet);

entityManager.persist(v);

现在你可以看到我正在添加相同的对象两次。一次到P,一次到V_D_P。但是,由于这些是相同的对象,因此只有一个对象应该保留。但是,根据休眠日志,我看到休眠正在尝试插入2个不同的对象。d

我还看到以下异常:ORA-00001:唯一约束

有没有办法让冬眠这些是相同的对象,并只将它们存在一次?


答案 1

对象由 id 唯一标识。因此,它们必须具有相同的 ID。

  • 要么在之前提供ID,
  • 或保留一次,并在保存另一个对象之前刷新对象(因此它设置了id)。d

答案 2

请尝试而不是 。如本文所述,persist 不一定会立即更新对象的 ID。这意味着休眠可能会遇到你的'd'对象两次,就像遍历对象图一样。两次它都可能说“id为空,我需要插入一个新的!save()persist()

显然,这种行为没有很好的定义,因此它可能不会在所有情况下都发生。


推荐