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

tes*_*123 9 merge jpa entitymanager jpa-2.0

有一段时间我一直在想为什么在使用JPA时,我是否必须编写我的删除方法:

@Transactional
public void delete(Account account)
{
    if (entityManager.contains(account))
    {
        entityManager.remove(account);
    }
    else
    {
        entityManager.remove(entityManager.merge(account));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 17

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

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

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

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

  • 那讲得通。感谢分享。 (2认同)