【问题标题】:JPA Cascading Delete: Setting child FK to NULL on a NOT NULL columnJPA 级联删除:在 NOT NULL 列上将子 FK 设置为 NULL
【发布时间】:2010-04-22 20:25:47
【问题描述】:

我有两个表:t_promo_program 和 t_promo_program_param。

它们由以下 JPA 实体表示:

@Entity
@Table(name = "t_promo_program")
public class PromoProgram {
  @Id
  @Column(name = "promo_program_id")
  private Long id;

  @OneToMany(cascade = {CascadeType.REMOVE})
  @JoinColumn(name = "promo_program_id")
  private List<PromoProgramParam> params;
}

@Entity
@Table(name = "t_promo_program_param") 
public class PromoProgramParam {
  @Id
  @Column(name = "promo_program_param_id")
  private Long id;

  //@NotNull // This is a Hibernate annotation so that my test db gets created with the NOT NULL attribute, I'm not married to this annotation.
  @ManyToOne
  @JoinColumn(name = "PROMO_PROGRAM_ID", referencedColumnName = "promo_program_id")
  private PromoProgram promoProgram;
}

当我删除 PromoProgram 时,Hibernate 会访问我的数据库:

update
    T_PROMO_PROGRAM_PARAM 
set
    promo_program_id=null 
where
    promo_program_id=?

delete 
from
    t_promo_program 
where
    promo_program_id=? 
    and last_change=?

我不知道从哪里开始寻找问题的根源。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    哦,笨蛋,这是 PromoProgram 中缺少的“mappedBy”字段。

    【讨论】:

      【解决方案2】:

      仔细检查您是否保持双向关联一致性。那是;确保链接到PromoProgram 作为其父级的所有PromoProgramParam 实体也包含在所述父级的params 列表中。如果您愿意,无论哪一方“发起”关联,确保这种情况发生是个好主意;如果在 PromoProgramParam 上调用 setPromoProgram,则让 setter 自动将自身添加到 PromoProgram 的 params 列表中。反之亦然,当在 PromoProgram 上调用 addPromoProgramParam 时,将其设置为参数的父级。

      我之前也遇到过这个问题,这是由于没有保持双向一致性。我调试到 Hibernate 并发现它无法将删除操作级联给孩子,因为他们不在列表中。但是,它们肯定存在于数据库中,并导致 FK 异常,因为 Hibernate 尝试仅删除父级而不首先删除其子级(您可能也遇到过 @NonNull 就位)。

      仅供参考,我相信使 PromoProgramParam.promoProgram 字段(比如 100 次)不可为空的正确“EJB 3.0”方式是在 @ManyToOne 注释上设置 optional=false 属性。

      【讨论】:

        猜你喜欢
        • 2018-04-23
        • 1970-01-01
        • 2018-12-23
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        相关资源
        最近更新 更多