В чем разница между em.remove(st) и em.remove(em.contains(st)? St: em.merge(st));

Я получаю эту ошибку:

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

Затем я ищу его в stackru, и я нашел это решение:

вместо:

em.remove(student); 

Я использую сейчас:

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

Но я действительно не понимаю, почему это работает сейчас.

Может кто-нибудь сказать мне разницу между этими методами?

1 ответ

Решение

@ почему это работает сейчас, EntityManager работает только с ManagedEntities, Когда вы попытаетесь удалить объект, который уже отсоединен, вы получите исключение.

Таким образом, чтобы сделать безопасное удаление, вы должны сначала проверить, находится ли объект в управляемом состоянии или нет. это достигается em.contains метод.

И если этот объект еще не находится в управляемом состоянии, нам нужно вручную перевести его в управляемое состояние. Это может быть достигнуто с помощью слияния.

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));
}`
Другие вопросы по тегам