JPA级联操作报JpaSystemException cascade=“all-delete-orphan“问题的处理

首先我想吐槽一下这JPA报错得很奇怪,按照堆栈信息,把我引入到了一个不相干的地方,后来大胆推论,才发现真实的报错点,原来时JPA的更新时由于级联关系而抛出的错误。
在这里插入图片描述
实体类DataSetDef中,对fieldDefs这个属性的定义如下,

	/**
     * 字段定义
     */
    @OneToMany(mappedBy = "dataSetDef", fetch=FetchType.EAGER,cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }, orphanRemoval = true)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JsonIgnoreProperties(allowSetters = true, value = { "createdBy" })
    @OrderBy("ORD")
    @Fetch(FetchMode.SUBSELECT)
    private List<FieldDef> fieldDefs;

配置项cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE },意思为DataSetDef和fieldDefs级联新建、级联更新、级联删除。

报错处的语法是:
在这里插入图片描述
dataSetDef的List< FieldDef >是一个持久的集合存在hibernate的对象池里面,如果直接dataSetDef.setFieldDefs(newFields);;就把dataSetDef对FieldDef对象的引用指向hibernate对象池外了。
我们需要修改这个集合而不是重新指定一个新的集合到parent类中。
改动如下,问题解决:
法一、在业务代码中修改红框部分为:

	if(dataSetDef.getFieldDefs() != null){
		dataSetDef.getFieldDefs().clear();
	    dataSetDef.getFieldDefs().addAll(newFields);
    }else{
        dataSetDef.setFieldDefs(newFields);
    }

法二、在dataSetDef的实体类中重写setFieldDefs方法:

	public void setFieldDefs(List<FieldDef> newFields){
        this.fieldDefs.clear();
        this.fieldDefs.addAll(newFields);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值