2008-12-23 20 views
5

Ich versuche eine Anwendung zu erstellen, die ein Objektmodell mit einer Datenbank synchronisiert hält, indem alle Änderungen beobachtet und dann die Objekte in Fragen sofort beibehalten werden. Viele der Objekte im Modell haben Kinder in großen Listen oder Bäumen.JPA-Kaskadenoptionen zur Laufzeit

Wenn ich ein Objekt aus der Datenbank lade, verlasse ich mich auf eine einseitige Kaskadierungsbeziehung, um auch alle seine untergeordneten Elemente abzurufen und sie in die Anwendung aufzunehmen.

Es ist jedoch möglich, ein Feld im übergeordneten Objekt zu ändern, für das Persistenz erforderlich ist, und ich kann feststellen, dass keines der untergeordneten Objekte betroffen ist. Also möchte ich den Elternteil persistieren, ohne die Datenbank mit all dem kaskadierten Kind anzuhalten.

zB

@Entity 
public class Parent { 

    @OneToMany(cascade=CascadeType.ALL) 
    public List children; 

} 

Wie kann ich die CASCADE-Option außer Kraft setzen, wenn ich ein übergeordnetes Objekt bestehen bleiben? Oder sollte ich es einfach auf REFRESH setzen und sicherstellen, dass ich nie eine Kaskadierung brauche?

Antwort

4

Das Lesen der Objekte aus der Datenbank und ihre Persistenz hängen von zwei verschiedenen Annotationen ab.

Wenn Sie ein Objekt laden, erhält es auch das andere Ende aller Eager-Beziehungen (FetchType.EAGER), wie sie durch die Eigenschaft fetch für die Beziehung definiert sind.

Abhängig von Ihrem JPA-Anbieter haben Sie möglicherweise Optionen, dieses Verhalten zu überschreiben. EclipseLink, über die unglaublich nützliche , sicherlich.

Wenn Sie fortfahren, löschen oder aktualisieren, ist der Kaskadentyp relevant.

Also, verlieren Sie die Kaskade, halten Sie den Abruf und Problem gelöst.

Persönlich denke ich Kaskade alle Fragen nach Ärger, aber Meinungen werden variieren.

Ein anständiger JPA-Provider wird bereits ein ziemlich ausgeklügeltes (konfigurierbares) Caching-Schema haben. Vielleicht sollten Sie sich fragen, warum Sie dieses Rad neu erfinden?

Ist es ein Problem von asynchronen Updates rein für die Leistung? Oder ist etwas anderes der Grund?

+0

Es ist eine eigenständige App mit der Datenbank auf demselben Computer oder einem Server in der Nähe. Das gesamte Modell muss sich im Speicher befinden, damit der Benutzer damit spielen kann. Ich versuche, das Ergebnis aller Benutzeraktionen zu erhalten, so dass sie nie auf "Speichern" klicken müssen. – Cogsy