JPA(Hibernate)级联操作,save的时候出现PersistentObjectException: detached entity passed to persist异常

出现异常的大概流程:
Parent parent = new Parent();
Child child = childRepository.findById(childIId);
parent.set(child);
parentRepository.save(parent);

Parent:(忽略报错,示例用)在这里插入图片描述

==============================================

找了半天常见的中文博客网站给的答案基本是:
1、实体在创建保存的时候写了ID导致

不适用我的情况,我这里报错的是子实体,子实体是已存在且不会在这边被操作的实体

2、将CascadeType.PERSIST去掉,只留下CascadeType.MERGE

简单粗暴的方法,可以解决问题。
但是项目里的这个实体类是已经用了很久也没变动过,这里我如果把它改掉我不确定之前的项目是否会出现其他新问题。
从这个方法可行可以得出1、执行了persist 2、persist报错。但是道理上应该是不会执行persist因为我的child是从数据库中取得的。
对于cascadeType网上都是清一色答案,我也就没有再去深究原因,等有时间再查明。

==============================================

最后跑到stackoverflow上找,有提到了一点是添加事务/改变事务策略。
于是有了另一个可行的简单粗暴解决方法,在业务方法上加上事务注解标签@Transactional。这也是我选择的方法,因为不会动到原先的代码。
至于原因,结合文章个人理解为我的save过程中hibernate session被关闭(关闭原因尚未查明),session关闭后子实体脱离变成的detached态。由于当前没有关联的session所以datached的实体想要转为persistent就会出现了detached entity passed to persist异常(CascadeType.PERSIST),加上事务是为了让session在整个保存过程中保持活动不被关闭。
也就是说折腾半天是为了让一个不影响结果的(从删掉CascadeType.PERSIST可以运行看出)persist可以执行(?)

==============================================

解决问题的方法是有了,但是感觉自己的理解不是很清晰,而且还有诸多疑点没有查明,待查明时再做更新。小弟才疏学浅,有理解错的地方望各路大神解答指正~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值