簡體   English   中英

Hibernate嘗試兩次持久保存同一個對象

[英]Hibernate trying to persist same object twice

我有3個類對應3個表VDP D有一個FK到VFK_V )並且使用OneToMany關系加入。 他們也退出第4個表V_D_P ,它具有這些VDP的關系。

以下是這些數據模型的樣子:

@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);

現在你可以看到我正在兩次添加相同的d對象。 一次到P,一次到V_D_P。 但是,由於它們是相同的對象,因此只能存在一次。 但是根據hibernate日志,我看到hibernate試圖插入2個不同的對象。

我還看到以下異常: ORA-00001:唯一約束

有沒有辦法讓hibernate這些是相同的對象並且只持有它們一次?

對象由id唯一標識。 因此他們必須具有相同的ID。

  • 要么之前提供id,
  • 或保留一次並在保存另一個之前刷新d對象(因此它設置了id)。

嘗試save()而不是persist() 正如指出的這個帖子 ,堅持不一定立即更新對象的ID。 這意味着hibernate可能會遇到你的'd'對象兩次遍歷對象圖。 兩次都可能會說“id為null,我需要插入一個新的!”。

顯然這種行為沒有明確定義,因此在所有情況下都可能不會發生。

你真的需要VDP.d字段:你不能只使用V和V之間的雙向(映射)關系(D)P(V(D)P會有av字段)並且只需導航V(D) PVD?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM