2013-04-18 1 views
10

Gibt es eine allgemeine Methode, dieJPA: prüfen, ob ein Unternehmen Objekt beibehalten worden ist oder nicht

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

kann also die oben beschriebene Methode Logik enthalten ist überall sicher?

+2

Warum brauchen? 'merge()' führt diese Überprüfung bereits durch. – axtavt

+0

@axtavt Danke. Wenn also die Entity niemals persistiert, wird 'merge()' die Entity beibehalten? Andernfalls die Entität zusammenführen und eine zusammengeführte Kopie zurückgeben? – Dreamer

+2

Ja, aber für transiente Objekte gibt es auch eine persistente Kopie zurück, anstatt das ursprüngliche Objekt zu erhalten. – axtavt

Antwort

14

Wenn Sie wissen müssen, ob das Objekt bereits im Persistenzkontext ist, sollten Sie contains Methode EntityManager verwenden.

Nur EntityManager kann Ihnen sagen, ob die Entität persistent ist oder nicht, Entität hat keine solche Information.

Hier können Sie Javadoc für contains method überprüfen.

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

sicher, sollte dies sein, wenn (! Em.contains (entity))? Andernfalls behalten Sie eine Entität bei, die bereits in der em ... enthalten ist. –

+1

Wenn die persistente Entität getrennt ist, funktioniert diese Methode nicht. – Sunnyday

+0

Wie von @ Sunnyday angegeben, ist diese Antwort irreführend. Gemäß der JPA-Spezifikation ist die Methode 'contains (..)' von 'EntityManager' nicht als Suchmethode für den aktuellen DB-Zustand einer 'Entity' definiert, sondern als Suche innerhalb eines Persistenzkontextes. Weitere Klarstellungen finden Sie in meiner Antwort hier: https://stackoverflow.com/a/49114622/2849346 – MWiesner

2

Um zu überprüfen, ob Entitätsobjekt durch den aktuellen PersistenceContext wurde beibehalten oder nicht Sie die EntityManager Methode haben Sie es verwenden können contains(Object entity)