5 Stimmen

JPA-Kaskadenoptionen zur Laufzeit

Ich versuche, eine Anwendung zu erstellen, die ein Objektmodell mit einer Datenbank synchron hält, indem sie alle Änderungen beobachtet und die fraglichen Objekte dann sofort persistiert. Viele der Objekte im Modell haben Kinder in großen Listen oder Bäumen.

Wenn ich ein Objekt aus der Datenbank lade, verlasse ich mich auf eine einseitige kaskadierende Beziehung, um auch alle seine Kinder abzurufen und sie in die Anwendung einzubeziehen.

Es ist jedoch möglich, ein Feld im übergeordneten Objekt zu ändern, das Persistenz erfordert, und ich kann feststellen, dass keines der Kinder davon betroffen ist. Ich möchte also das übergeordnete Objekt persistieren, ohne die Datenbank mit allen kaskadierten untergeordneten Persistenzen zu belasten.

z.B.

@Entity
public class Parent {

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

}

Wie kann ich die Kaskadenoption außer Kraft setzen, wenn ich ein übergeordnetes Objekt aufrechterhalte? Oder sollte ich es einfach auf REFRESH setzen und sicherstellen, dass ich niemals eine kaskadierende Persistierung benötige?

4voto

cletus Punkte 596503

Das Lesen der Objekte aus der Datenbank und ihre Persistierung beruhen auf zwei verschiedenen Anmerkungen.

Wenn Sie ein Objekt laden, erhält es auch das andere Ende eines jeden eifrigen ( FetchType.EAGER ) Beziehungen, wie durch die Fetch-Eigenschaft der Beziehung definiert.

Abhängig von Ihrem JPA-Anbieter haben Sie möglicherweise die Möglichkeit, dieses Verhalten außer Kraft zu setzen. EclipseLink, über die unglaublich nützliche QueryHint.BATCH Das ist sicher der Fall.

Wenn Sie persistieren, löschen oder aktualisieren, ist der Kaskadentyp ausschlaggebend.

Also, weg mit der Kaskade, her mit dem Fetch und das Problem ist gelöst.

Ich persönlich bin der Meinung, dass die Kaskade nur Ärger bringt, aber die Meinungen sind unterschiedlich.

Ein anständiger JPA-Anbieter verfügt bereits über ein ziemlich ausgefeiltes (konfigurierbares) Caching-System. Vielleicht sollten Sie sich fragen, warum Sie das Rad neu erfinden müssen?

Handelt es sich um asynchrone Aktualisierungen aus reinen Leistungsgründen? Oder ist etwas anderes der Grund?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X