【问题标题】:JPA 2.0 EntityManager merge remove a reference do nothingJPA 2.0 EntityManager 合并删除引用什么都不做
【发布时间】:2015-04-13 12:33:32
【问题描述】:

我正在尝试使用合并从父实体中删除子实体(不删除数据库中的引用),我所做的是从父实体中获取 @OneToMany 字段的集合,然后从集合中删除,最后我使用合并,当我使用相同的方法但添加而不是删除时,这有效,实体是:

@Entity
@Table(name="bills")
public class Bill {

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="bill")
    private Set<BillDetail> billDetails = new LinkedHashSet<>();

    ...
}

@Entity
@Table(name="billDetails")
public class BillDetail {

    @ManyToOne()
    @JoinColumn(name="bill")
    private Bill bill;

    ...
}

我进行合并的代码是:

Collection<Object> references = (Collection<Object>) PropertyUtils.getSimpleProperty(parentEntity, referenceField);
references.remove(childEntity); // the adding are the same, only i change remove for add here
PropertyUtils.setSimpleProperty(parentEntity, referenceField,references);

requirementCheck.setData(childEntity);

entityManager.getTransaction().begin();
entityManager.merge(parentEntity);
entityManager.getTransaction().commit();

entityManager.close(); 

所以当我删除时我没有看到任何更新日志,我错过了什么?我在进行合并的类上使用@Transactional,我同时使用aspectj和Spring AOP(确保没有将AOP和Aspectj应用到同一个方法)我也在使用Hibernate

【问题讨论】:

    标签: java spring jpa merge jpa-2.0


    【解决方案1】:

    关系归 BillDetail 实例所有,因此对关系的任何更改都需要更改 BillDetail,并且需要合并 BillDetail。

    它在添加时起作用,因为合并能够级联关系,因此 BillDetail 中的更改也被合并。删除引用时,您会切断此引用,从而阻止级联选项找到您的 BillDetail 实例,因此您必须在清除其账单引用后手动对其调用合并。

    【讨论】:

    • 如果我理解,我需要做的是取消设置 BillDetail 中的 Bill,从集合中删除 BillDetail,然后进行合并?但合并必须应用于 BillDetail 或 Bill?
    • 您更改了两个实例,因此需要合并两者以保持 JPA 缓存不同步。如果您只是将更改合并到 BillDetail,数据库将反映更改
    • 我忘了告诉在这种情况下 parentEntity 是 Bill 而 childEntity 是 BillDetail,我也尝试合并两者但没有任何反应,合并的顺序很重要吗?
    • 它终于起作用了,我首先要做的是像上面的代码一样从 parentEntity 中的集合中删除,然后在 childEntity 中取消设置 parentEntity,最后合并第一个孩子,然后合并 parentEntity,但现在在我的addReference 方法寄存器与不同的 id 重复,在此方法中,如果 id 为空,我创建 childEntity 并持久化,然后我添加对 parentEntity 的引用,但是当合并时我再次获得插入(当我调试 childEntity 有一个 id ) 所以我得到了两个插入,一个在持久化中,一个在合并中
    猜你喜欢
    • 2023-03-23
    • 2023-03-23
    • 2015-05-25
    • 2017-06-08
    • 2013-05-06
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多