JPA 2.0 EntityManager 合并删除引用什么也不做
JPA 2.0 EntityManager merge remove a reference do nothing
我正在尝试使用合并从父实体中删除子项(不从数据库中删除引用),我所做的是从父项中获取@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();
所以我在删除时没有看到任何更新日志,我缺少什么?我在 class 上使用 @Transactional 进行合并,我同时使用 aspectj 和 Spring AOP(确保没有将 AOP 和 Aspectj 应用于同一方法)我也是使用 Hibernate
该关系由 BillDetail 实例拥有,因此对该关系的任何更改都需要更改 BillDetail,并且需要合并 BillDetail。
它在添加时起作用,因为合并能够级联关系,以便 BillDetail 中的更改也被合并。删除引用时,您会切断此引用,从而阻止级联选项找到您的 BillDetail 实例,因此您必须在清除其账单引用后手动调用合并。
我正在尝试使用合并从父实体中删除子项(不从数据库中删除引用),我所做的是从父项中获取@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();
所以我在删除时没有看到任何更新日志,我缺少什么?我在 class 上使用 @Transactional 进行合并,我同时使用 aspectj 和 Spring AOP(确保没有将 AOP 和 Aspectj 应用于同一方法)我也是使用 Hibernate
该关系由 BillDetail 实例拥有,因此对该关系的任何更改都需要更改 BillDetail,并且需要合并 BillDetail。
它在添加时起作用,因为合并能够级联关系,以便 BillDetail 中的更改也被合并。删除引用时,您会切断此引用,从而阻止级联选项找到您的 BillDetail 实例,因此您必须在清除其账单引用后手动调用合并。