在@OneToMany 中实现 orphanRemoval

Posted

技术标签:

【中文标题】在@OneToMany 中实现 orphanRemoval【英文标题】:Implementing orphanRemoval in @OneToMany 【发布时间】:2020-11-29 02:27:54 【问题描述】:

所以我试图在单亲关系中移除孩子,但我不确定这是否是正确的做法。我在网上阅读如何做到这一点,但很多人谈到了实体管理器、级联、使用查询等。我不确定采用哪种方式,通常我使用 crudrepository 并简单地执行 .save 和 .deleteById 等。

这是我目前所拥有的

@Entity
public class User

@OneToMany(orphanRemoval = true, cascade = CascadeType.PERSIST)
    private List<Payment>payment = new ArrayList<Payment>();

getters/setters

@Service
public class UserService 


    public void addPayment(User user, Payment payment) 
        user.getPayment().add(payment);
        
    
    public void removePayment(User user, Payment payment) 
        user.getPayment().remove(payment);
    

我必须在这里搞乱级联类型或实体管理器吗?

【问题讨论】:

【参考方案1】:

假设user 方法参数是一个已与会话关联的托管实体,那么是的,这是正确的方法。

当会话被刷新时,Hibernate 将删除从用户付款中删除的 Payment 实例。

【讨论】:

@Entity 是否通过会话自动管理?我用 crudrepositories 扩展了我的实体类 假设 user 实例是通过 findById() 或类似于 CrudRepository 的东西加载的,那么是的。【参考方案2】:

您可以尝试 CascadeType.ALL。它适用于我的情况。

【讨论】:

以上是关于在@OneToMany 中实现 orphanRemoval的主要内容,如果未能解决你的问题,请参考以下文章

如何在春季配置多对一和一对多关系? Hibernate会无限调用同一查询

JPA,打开 JPA OneToMany - FailedObject

Spring Data MongoDB:如何实现“实体关系”?

使用 SpringBoot 和 Hibernate 与复合 pk 的双向 @OneToMany 关系

Hibernate中,基于Annotation的简单树形结构的实现

如何在Castle.Core中实现IProxyGenerationHook的类中实现Equals和GetHashCode的覆盖方法?