更新空子集合抛出错误

时间:2016-01-11 11:00:33

标签: java spring hibernate

class Attribute{
--- other entity def

  @OneToMany(fetch=FetchType.LAZY, orphanRemoval=true, cascade=CascadeType.ALL)
  @JoinColumn(name="ATTRDEFID", nullable=false, insertable=false , updatable=false)
  @OrderBy("IDX")
  private List<Constraint> constraints = new ArrayList<Constraint>();  
--- other entity def
}

在更新/保存属性时,禁令为空。仅在更新的情况下抛出此错误。

  

org.springframework.orm.jpa.JpaSystemException:拥有实体实例不再引用具有cascade =“all-delete-orphan”的集合:com.revitas.cm.persistence.term.Attribute.constraints;嵌套异常是org.hibernate.HibernateException:拥有实体实例不再引用cascade =“all-delete-orphan”的集合:com.revitas.cm.persistence.term.Attribute.constraints

当我设置空集合而不是null时,它已成功保存。

if(attribute.getConstraints()==null){
        attribute.setConstraints(new ArrayList<>());
    }

为什么抛出这样的错误?为什么通过空集合解决了?它是否正确解决方案? 我用谷歌搜索this。但没有弄清楚为什么会出现这样的问题。

1 个答案:

答案 0 :(得分:0)

问题在于包含空约束的属性,并且称为更新的合并操作。

根据hibernate提供的此链接https://hibernate.atlassian.net/browse/HHH-7726

  

通过parent.setChildren(null)删除子项,然后使用session.merge(parent)提交更改抛出org.hibernate.HibernateException:使用cascade =&#34; all-delete-orphan&#34;的集合所拥有的实体实例不再引用:Parent.children

要么设置空集合,要么在json时不传递值。 Json输入将有两种方式:

1)[]

2)没有传递元素。