[英]Hibernate trying to persist same object twice
我有3個類對應3個表V
, D
和P
D
有一個FK到V
( FK_V
)並且使用OneToMany關系加入。 他們也退出第4個表V_D_P
,它具有這些V
, D
和P
的關系。
以下是這些數據模型的樣子:
@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.
}
現在我想堅持V
, D
和P
以及他們的關系。 我是
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。
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.