java - 一对多 : hibernate tries to nullify external reference instead of deleting whole child

标签 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...问题是我不是要求将此引用设置为 null,而是删除整个元素!

这是为什么?

最佳答案

通常对子元素的 FK 约束可以为 null,因为如果我没记错的话,hibernate 会以这种方式进行删除:

  1. 将子实体的FK设置为​​null
  2. 删除子实体

因此,如果您在数据库级别强制执行非空约束,则必须手动从数据库中删除该实体。

关于java - 一对多 : hibernate tries to nullify external reference instead of deleting whole child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098177/

相关文章:

java - 用于显示和CRUD操作的实体类

java - 在不同数据库之间复制数据(都支持jdbc)

java - java启动时创建一个文件

java - hibernate 还是 JPA?

java - 编写 orm.xml 的最佳实践

java - 强制 Spring Boot @Scheduled 方法在失败时调用 "out of schedule"

java - spring 中的 sessionFactory 配置与 hibernate 版本 4+

java - 如何在 JSOUP 中禁用转义模式?

java - 如何找到JPA的版本?

java - 使用java将图像加载到数组中