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

cmtran

Mitglied
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:

Neaera

Mitglied
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:

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
 

Ähnliche Java Themen

Neue Themen


Oben