2016-03-23 8 views
2

1.Ich habe eine komplexe Entität mit faulen Assoziationen. Ich lade es in eine Eigenschaft in meiner @Viewscoped-Bean (es ist getrennt).verhindern Spülung nach dem Zusammenführen im Ruhezustand

2.Ich ändere einige Felder in der Entity (noch getrennt).

3.Now Ich brauche die faule Objekte aus meiner Einheit, so dass ich fusionieren die Entität Kontext Persistenz und initialisieren die faulen Objekte wie:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public MyEntity loadTheLazyObjects(MyEntity myEntity){ 
    //at the beginning myEntity is detached 
myEntity = entityManager.merge(myEntity) //it is managed now 
myEntity.getSomeLazyCollection.size(); //initialize lazy collection 
entityManager.clear(); //myEntity is detached again 
return myEntity; 
} 

Ich brauche die Einheit zu verschmelzen, so kann ich die faul laden Assoziationen (Ich brauche eine aktive Hibernate-Sitzung), aber ich möchte nicht, dass die Änderungen in meiner Entität in der Datenbank gespeichert werden. Deshalb löse ich es vor dem Ende der Transaktion vom Persistenzkontext ab. Wird es helfen?

Ich möchte keine SQL UPDATES auf myEntity, wenn die Transaktion abgeschlossen ist, und ich denke, Hibernate wird das Objekt zur Aktualisierung nach der Zusammenführung vorbereiten, also löst das Abtrennen des Objekts verhindern Hibernate vor dem Ende der Transaktion feuern Updates? Kann der Flush während der Zusammenführung aufgerufen werden?

+1

Sie könnten argumentieren, dass, da die Objekte auf diese Weise faul geladen sind, Sie auch eine separate Abfrage erstellen können, um sie abzurufen. Ich weiß nicht, wie Sie die Entität nicht mit Merge aktualisieren. –

+0

Der Zweck der Zusammenführung ist das Zusammenführen. Wenn Sie eine Art kombiniertes Objekt benötigen. Laden Sie das zuständige Objekt aus der Datenbank und führen Sie es selbst zusammen. f. ModelMapper –

+0

anstelle von 'merge()', können Sie 'em.find()' entsprechende Entity (es wird bis 'em.clear()') verwaltet werden und eine Sammlung von dort nehmen. –

Antwort

3

merge wird nie eine implizite flush auslösen. Flushing tritt nur in den folgenden drei Situationen:

  1. Vor der Ausführung der Abfrage (HQL/JPQL und nativen Abfragen) in Fällen, wenn Hibernate kommt zu dem Schluss, dass die ausgeführte Abfrage mit veralteten Daten in der Datenbank arbeiten kann.
  2. Wenn flush explizit aufgerufen wird.
  3. Wenn die Transaktion festgeschrieben ist.

Wenn Sie absolut sicher sein, dass keine Spülung (es sei denn, Sie explizit nennen, natürlich) auftreten, stellen Sie den Flush-Modus manual:

entityManager.unwrap(Session.class).setFlushMode(FlushMode.MANUAL); 

JPA Spülmodus nicht manuell unterstützt Option, deshalb muss die native Hibernate Session API verwendet werden.

Auf diese Weise müssen Sie den Persistenzkontext nach dem Zusammenführen nicht löschen, es werden trotzdem keine Änderungen gelöscht.

Verwandte Themen