【问题标题】:When using JPA entityManager why do you have to merge before you remove?使用 JPA entityManager 时,为什么必须在删除之前合并?
【发布时间】:2023-03-23 19:39:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: jpa merge jpa-2.0 entitymanager


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是有道理的。感谢分享。
    猜你喜欢
    • 2015-04-13
    • 2021-11-25
    • 2013-09-21
    • 1970-01-01
    • 2014-07-04
    • 2020-02-13
    • 2013-05-06
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多