2012-07-18 9 views
20

Czy usunąć (podmiot Object) metoda EntityManager pracy tylko na te obiekty dostał od znaleźć() metoda?javax.persistence.Entitymanager: usunąć() metoda

Mam następujący fragment kodu:

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

Ale to nie jest usunięcie konkretnego wpisu z bazy danych.

Kiedy próbowałem coś jak poniżej:

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

to działa dobrze.

Odpowiedz

24

Cytując instrukcji ObjectDB w sprawie deleting JPA entity objects:

W celu usuń obiekt z bazy danych, który musi najpierw zostać pobrany (bez względu na sposób), a następnie w aktywnej transakcji można go usunąć za pomocą metody remove.

Wyjątek IllegalArgumentException jest wywoływany przez remove, jeśli argument nie jest instancją klasy encji lub jeśli jest to obiekt oderwany.

Podczas tworzenia obiektu z operatorem new staje się oddzielnym obiektem, należy go zachować, aby go usunąć.

Podczas pobierania obiektu pobierasz element trwały.

+0

Biorąc pod uwagę powyższe zdanie, jest em.remove (em.merge (osoba)) - gdzie osoba została pobrana z bazy danych - poprawny sposób na usunięcie obiektu ? – dendini

+0

@dendini Nie, jeśli 'osoba' została pobrana z bazy danych, oznacza to, że istnieje w bazie danych. Tak więc w tym przypadku możesz zadzwonić bezpośrednio 'em.remove (osoba)'. –

+3

Musisz więc wybrać SELECT, a następnie DELETE, które są 2 zapytaniami, podczas gdy możesz to zrobić w jednym rodzimym DELETE. Dlaczego jest zbędny, jeśli chodzi o WZP? – sura2k

13

Coś w tym kierunku. EntityManager.remove działa tylko dla zarządzanych podmiotów. Jak uzyskaniu tych zarządzanych podmiotów nie ma znaczenia, może to być na przykład:

  • poprzez JPQL zapytania
  • poprzez kwerendy API Criteria
  • metoda znalezisko w EntityManager
  • przez następującą zależność od innego podmiotu.
  • utworzony nowy podmiot i utrzymywały ją

Ale po prostu tworząc nowy obiekt i stara się usunąć to nie działa, bo to nowy obiekt nie jest zarządzany podmiot. Również jednostka nie powinna być oderwana.

życia jednostki jest dość dużo, jak następuje, wszystkie w tej samej transakcji (podmioty poza ich transakcji nie są zarządzane):

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 
+0

Dzięki za przykład. Teraz mam pomysł oddzielonego bytu. Nadal myślę, że powinien on rzucić wyjątek mówiąc "podmiot nieobecny lub coś" – sachinpkale

3

Tak, w przypadku scalania lub usunięcia operacji należy użyć operacji find lub findBy, a następnie użyć metody remove w pobranej encji.

Powiązane problemy