JPA CascadeType.PERSIST未持久化父实体却触发子实体持久化问题咨询
这种行为完全正常,具体原因如下:
你的
Parent实体处于「托管状态」
通过parentRepository.find(id)查询得到的Parent是被Hibernate持久化上下文管理的托管实体——Hibernate会持续跟踪该对象的所有状态变化,包括关联集合的修改。CascadeType.PERSIST的生效场景不止一种
教程中描述的「父实体被持久化时自动持久化子实体」,是针对未被持久化过的瞬时状态Parent调用em.persist(parent)的场景。但当Parent已经处于托管状态时,Hibernate的脏检查机制会检测到你给它的集合新增了Child,此时配置的CascadeType.PERSIST会触发级联操作,自动将这个新的瞬时状态Child持久化到数据库。Spring事务的隐性刷新操作
你的addChild()方法大概率被Spring的@Transactional注解修饰(Spring Data仓库方法默认会自动开启事务)。当事务结束时,Hibernate会自动刷新持久化上下文,将所有跟踪到的变更(包括新增的Child)同步到数据库,无需你手动调用save方法。
可验证的测试点:
- 将
Parent的children集合改为不可变类型(比如用listOf()替代可变集合),或者移除CascadeType.PERSIST配置,新增的Child将不会被自动持久化。 - 若在方法内手动调用
entityManager.detach(parent),让Parent脱离托管状态,新增的Child也不会被持久化。
内容的提问来源于stack exchange,提问作者Ondřej Míchal
相关产品推荐
相关产品推荐

