Подтвердить что ты не робот

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);
}

Он отлично работает.

4b9b3361

Ответ 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(), а затем использовать метод удаления для извлеченной сущности.