如何用Spring JPA和Hibernate保存新/游离Child对象无需显式保存?
解决JPA关联瞬时/游离态Child的保存问题
直接上可行方案:
调整级联策略
修改Parent类中的@ManyToOne注解,添加PERSIST和MERGE复合级联类型:
@Entity @Table(name = "parent") class Parent{ @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "child") private Child child; }
为什么这能解决问题?
- 加
CascadeType.PERSIST:当Child是新建的瞬时态实例时,会跟随Parent一起被持久化,解决object references an unsaved transient instance - save the transient instance before flushing报错 - 加
CascadeType.MERGE:当Child是从数据库查询到的游离态实例时,JPA会自动将其合并到当前持久化上下文,避免detached entity passed to persist报错 - 由于Child没有反向关联Parent,这种级联配置不会产生多余的数据库操作,完全适配你"查询或创建Child后直接关联Parent保存"的业务逻辑
不需要额外显式保存Child,直接调用parentRepository.save(parent)即可处理两种场景。
内容的提问来源于stack exchange,提问作者Salil Surendran
相关产品推荐
相关产品推荐

