2016-06-30 3 views
0

Ich habe zwei assoziierte entites:warum Hibernate Update DB nach evict

@Entity 
@DynamicUpdate(true) 
public class DreamTaskInfo { 
    private DreamInfo dreamInfo; 
    @ManyToOne 
    @JoinColumn(name = "DREAM_INFO_ID", nullable = false) 
    public DreamInfo getDreamInfo() { 
     return dreamInfo; 
    } 
... 
} 

@Entity 
@DynamicUpdate(true) 
public class DreamInfo { 
    private Set<DreamTaskInfo> dreamTasks = new LinkedHashSet<>(); 
    @OneToMany(mappedBy = "dreamInfo",cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @OrderBy("remindTime") 
    public Set<DreamTaskInfo> getDreamTasks() { 
    return dreamTasks; 
    } 
    ... 
} 

Ich möchte ein DreamTaskInfo Daten von DB für Nur-Lese-Anwendung verwenden, so dass ich dies tun:

DreamTaskInfo task = this.get(id);//query from db 
getSession().evict(task);//getSession().contains(task)==false 

Aber ich finde out Hibernate führen immer eine Aktualisierung sql für diese Aufgabe beim Flush aus. Endlich benutze ich getSession(). Clear() statt zu vertreiben und es funktioniert. Vielleicht eifrig holen oder Assoziation Ergebnis in etwas in Sitzung? Eigentlich ändere ich nichts manuell und Hibernate Update automatisch, so dass es nichts mit diesem question zu tun hat.

+0

Mögliches Duplikat von [Hibernate: evict() ein persistentes Objekt beim Speichern seiner Änderungen] (http://stackoverflow.com/questions/6836326/hibernate-evict-a-persistent-object-while-storing-its-changes) –

+0

Können Sie die Update-Abfrage zusammen mit ihren Parametern veröffentlichen. Es lohnt sich zu debuggen, um zu sehen, warum das Update generiert wurde. –

+0

@Vlad Mihalcea, tatsächlich aktualisiert es jedes Feld des Datensatzes mit Wert Abfrage von DB. – yuxh

Antwort

0

Sie müssen die Sitzung vor dem Aufruf von evict() leeren. Dann sehen Sie nicht, dass die Aktualisierungsabfrage nach der Räumung() ausgeführt wird.

Lösung:

DreamTaskInfo task = this.get(id);//query from db 
getSession().flush();// to make sure atomicity of session is maintained 
getSession().evict(task);//getSession().contains(task)==false 

es einige Änderungen haben könnte, nachdem Sie das Objekt aus der Datenbank geholt, weshalb Hibernate-Update-Abfrage ausgeführt wird.

Die Sitzung soll aus gutem Grund eine arbeitseinheitsbasierte Schnittstelle sein - die transaktionale Semantik wäre ein Desaster ohne diese Funktion. Wenn Sie einzelne Entitäten leeren müssen, ohne andere zu löschen, die Teil derselben Sitzung sind, müssen Sie Ihre Arbeitseinheit überdenken.

+0

Ich vergesse zu erwähnen, dass ich diesen Weg versucht habe, aber nicht funktioniert. – yuxh

+0

"könnten einige Änderungen sein, nachdem Sie das Objekt aus der Datenbank geholt haben", habe ich den gleichen Gedanken, aber ich benutze Junit, um diese Methode zu testen und nichts zu verändern, also weiß nicht, wie dies genau passiert. – yuxh

+0

, auch wenn Sie nichts geändert haben. Sie müssen noch für die Sitzung flush aufrufen. Aber wie du schon sagtest, hast du es versucht. Ich werde es noch einmal überprüfen und zu dir zurückkommen. –

Verwandte Themen