web-dev-qa-db-fra.com

javax.persistence.Entitymanager: méthode remove ()

Est-ce que supprime la méthode (entité d'objet) de EntityManager ne fonctionne que sur les objets obtenus de trouver la méthode ()?

J'ai l'extrait de code suivant:

public void deletePerson() {
    EntityManager em = getEntityManager();
    Person p = new Person("x", "y", 200);
    em.remove(p);
}

Mais il ne supprime pas l'entrée particulière de la base de données.

Quand j'ai essayé quelque chose comme ci-dessous:

public void deletePerson() {
    EntityManager em = getEntityManager();
    Person p = em.find(Person.class, 200);
    em.remove(p);
}

Ça marche bien.

21
sachinpkale

Citant le manuel d'ObjectDB sur suppression des objets d'entité JPA :

Pour supprimer un objet de la base de données, il doit d'abord être récupéré (quel que soit le chemin), puis dans une transaction active, il peut être supprimé à l'aide de la méthode remove.

Une exception IllegalArgumentException est levée par remove si l'argument n'est pas une instance d'une classe d'entités ou s'il s'agit d'une entité détachée.

Lors de la création d'un objet avec l'opérateur new, il devient une entité détachée, vous devez le conserver si vous souhaitez le supprimer.

Lorsque vous récupérez l'entité, vous récupérez l'entité persistante.

26
JMelnik

Quelque chose dans cette direction. EntityManager.remove ne fonctionne que pour les entités gérées. Peu importe comment vous avez obtenu ces entités gérées, cela peut être par exemple:

  • via une requête JPQL
  • via la requête de l'API Criteria
  • trouver la méthode dans EntityManager
  • en suivant la relation d'une autre entité.
  • a créé une nouvelle entité et l'a persisté

Mais simplement créer un nouvel objet et essayer de le supprimer ne fonctionne pas, car ce nouvel objet n'est pas une entité gérée. L'entité ne doit pas non plus être encore détachée.

La vie de l'entité est sensiblement la suivante, toutes dans la même transaction (les entités en dehors de leur transaction ne sont pas gérées):

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
13
Mikko Maunu

Oui, en cas d'opération de fusion ou de suppression, vous devez utiliser une opération find (), puis utiliser la méthode remove sur l'entité récupérée.

3
Mukul Goel