Javax.persistence.Entitymanager: метод remove()
Удаляет ли метод объекта EntityManager только те объекты, которые получены из метода find()?
У меня есть следующий фрагмент кода:
public void deletePerson() {
EntityManager em = getEntityManager();
Person p = new Person("x", "y", 200);
em.remove(p);
}
Но он не удаляет конкретную запись из базы данных.
Когда я попробовал что-то вроде ниже:
public void deletePerson() {
EntityManager em = getEntityManager();
Person p = em.find(Person.class, 200);
em.remove(p);
}
Он отлично работает.
Ответы
Ответ 1
Цитата из руководства ObjectDB на удаление объектов сущности JPA:
Чтобы удалить объект из базы данных, он должен сначала (независимо от того, в каком направлении), а затем в активной транзакции, это можно удалить с помощью метода remove.
Исключение IllegalArgumentException удаляется, если аргумент не a экземпляр класса сущности или если он является отдельным объектом.
При создании объекта с оператором new
он становится отдельным объектом, вам нужно его сохранить, если вы хотите его удалить.
При извлечении объекта вы извлекаете постоянную сущность.
Ответ 2
Что-то в этом направлении. EntityManager.remove работает только для управляемых объектов. Как вы получили эти управляемые объекты, не имеет значения, это может быть, например:
- через запрос JPQL
- через запрос API критериев
- Найти метод в EntityManager
- следуя отношениям от другого объекта.
- создал новый объект и сохранил его
Но просто создание нового объекта и попытка его удаления не работают, потому что этот новый объект не управляется сущностью. Кроме того, объект еще не должен быть отсоединен.
Жизнь объекта довольно много выглядит следующим образом: все в одной транзакции (сущности вне их транзакции не управляются):
Entity ent = new Entity(1); //entity is in new state, EntityManager never know
//anything about it
em.persist(ent); //entity is managed as long as not disconnected
//from EntityManager
em.clear(); // all previously managed entities, including ent, are now detached
Entity same = em.find(1); //managed same
em.remove(same); // entity is removed
Ответ 3
Да, в случае операции слияния или удаления необходимо использовать операцию find(), а затем использовать метод удаления для извлеченной сущности.