OneToMany:hibernate尝试取消外部引用,而不是删除整个子进程

时间:2015-03-17 11:42:05

标签: java hibernate

我有一个包含元素列表的实体“BigList”:

  @OneToMany( fetch = FetchType.LAZY, orphanRemoval=true )
  @Cascade( { CascadeType.ALL } )  
  @JoinColumn( name = "ID_LIST", referencedColumnName="ID", updatable=true, insertable=true )
  @OrderBy( value="position asc")
  List<BigListElem> elements;

BigListElem有这个引用:

  @ManyToOne( optional=false )
  @NotFound( action=NotFoundAction.EXCEPTION )
  @JoinColumn( name="ID_LIST", nullable=false, updatable=true, insertable=true  )
  private BigList list;

现在,如果我删除此列表中的一个元素并调用merge()方法(从而更新),我会得到以下异常:

impossible update ("DBNAME"."BIG_LIST_ELEM"."ID_LIST") to NULL

换句话说,它不是删除子节点而是尝试将外部引用设置为null,从而导致异常,因为“nullable”设置为false。 这是正确的,因为外部引用不能为空...问题是我不是要求将此引用设置为null但是删除整个元素!

为什么?

1 个答案:

答案 0 :(得分:2)

通常对子元素的FK约束是可空的,因为如果我记得正确的话,hibernate会以这种方式删除:

  1. 将子实体的FK设置为​​null
  2. 删除子实体
  3. 因此,如果在数据库级别强制执行非空约束,则必须从数据库中手动删除该实体。