11

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

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

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

4

1 回答 1

20

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

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

因此,如果它接受一个分离的实体,remove()则必须为您决定:要么合并分离的实体并根据分离的实体包含的内容执行删除操作,要么只是加载与分离的实体具有相同 ID 的实体,然后执行基于加载实体的操作。

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

于 2013-04-18T17:38:38.697 回答