我有 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。
- 要么提供之前的id,
- 或者坚持一次并在保存另一个之前刷新
d
对象(因此它具有 id 集)。
关于java - Hibernate 试图持久化同一个对象两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851279/