为什么在首先合并实体时,我会将已删除的实例传递给合并
我相信我想删除的实体是一个管理实体。 但是,无论如何,为什么合并它然后删除它给我以下错误:
删除的实例传递给合并
有人在stackoverflow上说,如果它是一个托管实体,那么应该忽略该合并。 那为什么不被忽视呢?
我希望删除它的方式是这样的:
TrialUser mergedEntity = em.merge(tu); em.remove(mergedEntity);
但这个错误,但如果我摆脱第一行它似乎工作正常。 但我想要另一种方式,因为这与代码的其余部分是一致的。
编辑:
@PersistenceContext(unitName = "UnitName") protected EntityManager entityManager; @Table(name="TRIAL_USER") @Id private BigDecimal id; @ManyToOne(cascade= {CascadeType.ALL }, fetch=FetchType.EAGER) @JoinColumn(name="TRIAL_USER_CLASS_ID3") private TrialUserElement trialUserElement3; @ManyToOne(cascade= {CascadeType.ALL }, fetch=FetchType.EAGER) @JoinColumn(name="TRIAL_USER_CLASS_ID1") private TrialUserElement trialUserElement1; @ManyToOne(cascade= {CascadeType.ALL }, fetch=FetchType.EAGER) @JoinColumn(name="TRIAL_USER_CLASS_ID2") private TrialUserElement trialUserElement2;
当您在事务中运行某些代码时,当您在方法结束时提交时,可能会出现此错误。 在使用注释的方法或类中使用spring时
@Transactional
发生这种情况是因为您首先删除了对象(未提交),然后尝试更新它。
此代码将生成exception:
@Transactional myethod(){ dao.delete(myObject); myObject.setProperty("some value"); dao.save(); }
为避免错误,您不应删除然后保存在同一事务中。
这是在黑暗中的一点点,因为我无法运行您的代码,这些类型的问题可能会变得有点复杂。 但请放心,合并然后删除应该没问题。 我怀疑它可能与您的多对一关联实体有关。
在事务提交时,删除被级联到链接的实体。
即使合并对于您的父实体来说是多余的,我认为合并正被级联到已被删除的子实体,因此是例外。
尝试更改级联规则 – 将其拉回CascadeType.MERGE(对于所有三个)并查看是否仍然获得exception。 或者更改为CascadeType.DELETE,这将阻止必要的合并级联。
JPA SPEC说:
3.2.7.1合并独立实体状态
如果X是已删除的实体实例,则合并操作将抛出IllegalArgumentException(或者事务提交将失败)。
这就是您无法合并已删除实体的原因。