使用JPA entityManager时,为什么在删除之前必须合并?

使用JPA entityManager时,为什么在删除之前必须合并?,jpa,merge,jpa-2.0,entitymanager,Jpa,Merge,Jpa 2.0,Entitymanager,一段时间以来,我一直在想,为什么在使用JPA时,我必须这样编写我的删除方法: @Transactional public void delete(Account account) { if (entityManager.contains(account)) { entityManager.remove(account); } else { entityManager.remove(entityManager.merge(ac

一段时间以来,我一直在想,为什么在使用JPA时,我必须这样编写我的删除方法:

@Transactional
public void delete(Account account)
{
    if (entityManager.contains(account))
    {
        entityManager.remove(account);
    }
    else
    {
        entityManager.remove(entityManager.merge(account));
    }
}

也许不需要contains,因为事务以这个方法开始和结束,但是我仍然想知道为什么remove不能只获取一个非托管对象。是因为需要对其进行管理才能知道该对象的id是什么?任何其他的见解都会很高兴听到。我只是想了解JPA删除的方式和原因。

删除操作可以级联到实体的关联

为了能够知道要删除哪些关联实体,实体管理器不能依赖分离实体,因为根据定义,该分离实体不反映实体的最新状态,也不一定递归加载其所有级联关联

因此,如果它接受分离的实体,
remove()
必须为您做出决定:要么合并分离的实体并根据分离的实体包含的内容执行移除操作,要么加载与分离的实体具有相同ID的实体,并根据加载的实体执行操作


它只需要一个附加的实体,而不是为您决定。这样,你就可以决定你想要什么。

这很有道理。谢谢分享。