В чем разница между 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));
}`