Es geht um JPA2.1 mit EclipseLink und einer Entity mit einer ManyToOne Beziehung.
@Entity
public class Bestellung implements Serializable {
...
@JoinColumn(name = "LieferantNr", referencedColumnName = "LieferantNr", insertable=false, updatable=false)
@ManyToOne
private Lieferant lieferant;
dazu diese Einfache Abfrage
... ... em.createQuery("select b from Bestellung b");
Mein Problem ist, dass beim Ausführen der o.g. Abfrage je Bestellung ein Query abgeschickt wird, um die LieferantenInfo zu holen. Das dauert leider etwas lange.
Ich hätte erwartet, dass JPA eine gejointe Abfrage abschickt und das Thema in einem Zug abwickelt.
Mache ich etwas falsch oder ist das vom Erfinder so gedacht?
Wir arbeiten täglich mit JPA in unserem Projekt. Mit den Query Hints haben wir gute Erfahrungen gemacht. Damit kann man einzelne Queries optimieren, was meistens zu besseren Resultaten führt als allgemeine Optimierungen.
Was wir auch gelernt haben: JPA und Performance sind zwei Welten die sich nicht mögen. JPA liebt es kleine Stücklein nachzuladen, und man muss jedes einzelne Query untersuchen um eine halbwegs brauchbare Anwendung zu kriegen. Der Einbau von Caches kann helfen. Wir haben bei unserem Server auch noch JOOQ eingebaut, um direkter mit der DB zu sprechen (mit dem Nachteil, dass man selbst eine Abstraktionsschicht zwischen DB und Businesslogik schreiben muss. Aber der Aufwand ist es uns Wert. Mittlerweile denken wir, dass ziemlich jede Lösung besser ist, als JPA).
Beni, ich stimme dir im Großen und Ganzen zu. Das gefährliche an JPA ist, dass es „Einfachheit“ verspricht, wo keine sein kann. Relationale Strukturen in Objekte herunterzubrechen ist hart, und da kann auch ein ORM nicht helfen. Wenn ich mir am Ende die fertige Anwendung anschaue, habe ich meistens pro View und pro Listenabfrage und pro Entity ein eigenes Query, bei welchem ich JPA genau sage, wie es auf die DB zuzugreifen hat, wie viel es zu laden hat und (teilweise) auch wie es zu joinen hat.
JOOQ hat mich in der Vergangenheit immer wieder mal interessiert, aber 90% unserer Kunden benutzen Oracle, und irgendwie möchte die Lizenzgebühren keiner zahlen