em.remove(st)和em.remove(em.contains(st)?st:em.merge(st))之间有什么区别;

时间:2018-03-15 11:36:56

标签: java jpa operational

我收到了这个错误:

java.lang.IllegalArgumentException: Removing a detached instance model.student

然后我在stackoverflow中搜索它,我找到了这个解决方案:

而不是:

em.remove(student); 

我现在正在使用:

em.remove(em.contains(student) ? student : em.merge(student));

但我真的不明白为什么它现在正在运作。

有人能告诉我这些方法之间的差异吗?

1 个答案:

答案 0 :(得分:3)

@为什么现在有效, EntityManager仅适用于ManagedEntities。当您尝试删除已经分离的实体时,您将获得异常。

因此,为了安全删除,您必须首先检查实体是否处于托管状态。这是通过em.contains方法实现的。

如果该实体尚未处于托管状态,我们需要手动将其移至托管状态。这可以通过使用merge来实现。

Merge基本上将该实体移动到托管状态。

<强> [编辑]

我可以在您的代码中看到您使用 em.find 检索了该实体,这将为您提供一个托管实体。但是你没有将这个值存储到任何东西并使用方法的输入参数,该参数不是由 em 管理的。请尝试以下代码,

`public void deleteStudentsPersistence(Student student) {
    Student managedEntity = em.find(Student.class, student.getId());
    em.remove(managedEntity);
   // em.remove(em.contains(student) ? student : 
   // em.merge(student));
}`