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

时间:2013-04-18 15:17:59

标签: 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(account));
    }
}

由于事务以此方法开始和结束,因此可能不需要包含,但我仍然想知道为什么删除不能只是取一个非托管对象。是因为需要对其进行管理才能知道该对象的id是什么?任何其他见解都会很棒。我只是想了解JPA删除的方法和原因。

1 个答案:

答案 0 :(得分:14)

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

为了能够知道要删除哪些关联实体,实体管理器不能依赖于分离的实体,因为根据定义,这个分离的实体不会反映实体的最新状态,并且不一定以递归方式加载所有级联关联。

所以,如果它接受了一个分离的实体,remove()必须为你决定:要么合并分离的实体,要根据分离的实体包含的内容执行删除操作,或者只需加载与分离实体具有相同ID的实体,并根据加载的实体执行操作。

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