有一段时间我一直在想为什么在使用JPA时,我是否必须编写这样的删除方法:
@Transactional
public void delete(Account account)
{
if (entityManager.contains(account))
{
entityManager.remove(account);
}
else
{
entityManager.remove(entityManager.merge(account));
}
}
由于事务以此方法开始和结束,因此可能不需要包含,但我仍然想知道为什么删除不能只是取一个非托管对象。是因为需要对其进行管理才能知道该对象的id是什么?任何其他见解都会很棒。我只是想了解JPA删除的方法和原因。
答案 0 :(得分:14)
删除操作可以级联到实体的关联。
为了能够知道要删除哪些关联实体,实体管理器不能依赖于分离的实体,因为根据定义,这个分离的实体不会反映实体的最新状态,并且不一定以递归方式加载所有级联关联。
所以,如果它接受了一个分离的实体,remove()
必须为你决定:要么合并分离的实体,要根据分离的实体包含的内容执行删除操作,或者只需加载与分离实体具有相同ID的实体,并根据加载的实体执行操作。
而不是为您决定,它只需要一个附加的实体。这样,你决定你想要什么。