JPA FetchType.LAZY, Relation @OneToMany und Problem mit dem update

Dieses Thema JPA - FetchType.LAZY, Relation @OneToMany und Problem mit dem update im Forum "Data Tier" wurde erstellt von cmtran, 19. Feb. 2014.

Thema: FetchType.LAZY, Relation @OneToMany und Problem mit dem update hallo zusammen, in meiner Anwendung habe ich zwei Entitäte wie im Folgendes definiert public class JpaCompany...

  1. hallo zusammen,

    in meiner Anwendung habe ich zwei Entitäte wie im Folgendes definiert

    public class JpaCompany implements ... {

    @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
    @JoinColumn(name="company_id", referencedColumnName = "entity_id", nullable = true)
    protected List<JpaOrder> orders;

    public List<Order> getOrders() {
    return this.orders;
    }

    @Override
    public void setOrders(List<Order> orders) {
    if(this.orders == null) {
    this.orders = new ArrayList<JpaOrder>();
    }
    ...........
    }
    }


    nun erzeuge ich im Frontend eine Entität Order und persistiere die. Im Frontend habe ich bereits eine attached Entität von Company. Die neue persistierte Order wird mittels setOrders() in der Company gespeichert. Anschließend mache ich ein update für Company. Normalerweise muss die Spalte "company_id" mit der companyId aktualisiert werden.

    Ich habe entdeckt, dass wenn der FetchType = LAZY ist, wird diese Spalte nicht aktualisiert. Wenn ich den FetchType auf EAGER ändere, wird die companyID in der Spalte gespeichert.

    Wie kann ich dieses Problem lösen. Ich möchte nicht alle Orders im Frontend laden. Wenn der Company eine Mio. Orders enthält, wird dann unglaubliche Speicher beim Laden gebraucht.

    Vielen Dank im Voraus!
     
    Zuletzt bearbeitet: 19. Feb. 2014
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Hallo,
    das ist mein erster Post, also bitte nicht allzu streng sein. :oops:

    Die Java-Codeteile bitte in die JAVA Tags schreiben, sonst ist es schwer den Code zu lesen.

    nun zu deinem Problem: FetchType.Lazy heißt, dass die Mappings (in deinem Beispiel OneToMany) nicht mitgeladen werden, FetchType.Eager lädt diese mit, aber das hast du ja schon richtig erkannt. Du musst nun zuerst deine Abhängigkeit extra speichern und diese dann in die Master Entity setzen. Also als kleines Beispiel:

    Code (Java):

    public class A {
    ...
    @OneToMany //FetchType.Lazy brauchst du nicht explizit angeben, ist default
    private B b;
    ...
    }

    //beim speichern dann folgendes:
    B slave =  repository.save(b);
    master.setB(slave);
    master = repository.save(master);
     
    lg