java - Hibernate 试图持久化同一个对象两次

标签 java hibernate jpa

我有 3 个类对应于 3 个表 VDPD 有一个 FK 到 V (FK_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 集)。

关于java - Hibernate 试图持久化同一个对象两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851279/

相关文章:

java - 将 Baritone API 实现到 Minecraft Forge mod 中

java.lang.ClassCastException : java. math.BigDecimal 无法转换为 java.lang.Long

java - 了解 spring 和注释,我必须在 xml 配置文件中连接什么

mysql - Hibernate 多对多选择

java - 标记为 "continue"似乎不起作用

java - 如何使用piccaso将下载的图像从一个 Activity 传递到另一个 Activity

java - 如何在Java中定义自定义异常类,最简单的方法?

java - SQL语法错误异常 : ORA-00932: inconsistent datatypes: expected DATE got BINARY

带有 JPA 的 Spring Data 不会在错误时回滚事务

java - 使用可选参数更新查询