为什么在首先合并实体时,我会将已删除的实例传递给合并

我相信我想删除的实体是一个管理实体。 但是,无论如何,为什么合并它然后删除它给我以下错误:

删除的实例传递给合并

有人在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(或者事务提交将失败)。

这就是您无法合并已删除实体的原因。