2013-04-18 14 views
10

Czy istnieje ogólna metoda, która możeJPA: sprawdzić, czy obiekt został jednostka utrzymywała czy nie

if(entity is persisted before){ 
    entity = entity.merge(); 
}else{ 
    entity.persist(); 
} 

Więc metoda zawierają powyżej logiką wszędzie jest bezpieczne?

+2

Dlaczego go potrzebujesz? 'merge()' już wykonuje tę kontrolę. – axtavt

+0

@axtavt Dzięki. Więc jeśli encja nigdy nie trwała, to 'merge()' utrzyma obiekt? W przeciwnym razie połączyć encję i zwrócić scaloną kopię? – Dreamer

+2

Tak, ale w przypadku obiektu przejściowego wraca również trwała kopia, a nie zachowuje oryginalny obiekt. – axtavt

Odpowiedz

14

Jeśli chcesz wiedzieć, to obiekt już w kontekście trwałości należy użyć contains metodę EntityManager.

Tylko EntityManager może powiedzieć, że jednostka jest trwała, czy nie, jednostka nie ma takich informacji.

Tutaj możesz sprawdzić javadoc dla contains method.

if (!em.contains(entity)) { 
    em.persist(entity); 
} else { 
    em.merge(entity); 
} 
+1

oczywiście, powinno to być, jeśli (! Em.contains (entity))? W przeciwnym razie zachowujesz pozycję podmiotu, który jest już "zawarty" w em ... –

+1

, jeśli uparty obiekt jest odłączony, ta metoda nie będzie działać. – Sunnyday

+0

Jak podaje @Sunnyday, ta odpowiedź jest myląca. Zgodnie ze specyfikacją JPA, metoda 'zawiera (..)' 'EntityManager' nie jest zdefiniowana jako metoda wyszukiwania dla rzeczywistego stanu DB' Entity', ale jako odnośnik w kontekście utrwalania. Dalsze wyjaśnienia znajdują się w mojej odpowiedzi tutaj: https://stackoverflow.com/a/49114622/2849346 – MWiesner

2

Aby sprawdzić, czy obiekt podmiot został lub nie utrzymywały przez obecnego PersistenceContext można użyć metody EntityManager contains(Object entity)

Powiązane problemy