Objekt mit lazy-verbindung komplettieren

Status
Nicht offen für weitere Antworten.

sparrow

Top Contributor
Hallo Forum,

ich habe ein Objekt mit einem enthaltenen Set. Das ist soweit kein Problem. Nachgeladen wird bei Bedarf über Lazy-Loading.
Gibt es eine Möglichkeit das Objekt auch so zu laden, dass es zwischenzeitlich nich über Lazy-Loading vervollständigt werden muss? Quasi ein erzwungenes Eager für ein einziges Laden?


Gruß und Dank im Vorraus
Sparrow
 
G

Guest

Gast
Schreib eine passende Query dazu.
z.B.
Code:
SELECT p FROM Person p JOIN FETCH p.adressen WHERE p.id = :personId
 

sparrow

Top Contributor
Also wenn das wirklich so einfach geht wie SlaterB sagt, das wäre ja fantastisch.
Angenommen man hat eine Pizza mit einer Liste von Belagen, dann könnte man mit Hibernate.initialize(Pizza) dafür sorgen, dass das Objekt inklusive der Liste der Belage aus der Datenbank geholt wird? Lazy Loading ist dann nicht mehr nötig?

Die Lösung vom Gast wirkt leider sehr statisch.

Gruß
Sparrow
 

semi

Top Contributor
Hi, Gast hier. ;)
Was meinst du mit statisch? Wenn das Eager-Loading eher Ausnahme ist, dann ist eine extra Query die übliche
Vorgehensweise. Funktioniert auch mit anderen JPA-Implementierungen, nicht nur mit Hibernate.

Übrigens, sowas wie Hibernate.initialize(object) impliziert, dass es bereits eine Instanz des Objektes gibt.
Was auch immer es tut, du hast bei dem Aufruf zusätzliche Queries. Gleiches kannst du auch erreichen,
wenn du direkt den Getter für die Collection aufrufst. Wenn ich dich richtig verstanden habe, willst du
gerade dies vermeiden und stattdessen alles auf einen Schlag lesen.
 

sparrow

Top Contributor
Huhu semi ;)

Du hast Recht, ich möchte ein Objekt so erhalten, dass ich damit session-unabhängig arbeiten kann. Zum Beispiel um es zu serialisieren.

Wenn ich das richtig verstehe gibt es 3 Möglichkeiten:

1) Hibernate.initialize(Object) welches die aber ein bereits vorhandenes Objekt voraussetzt

2) Dein Vorschlag mit der Query

3) Das Aufrufen aller getter für die Verbundenen Listen


Mit statisch meine ich, dass man dann alle Listen manuell mit der Abfrage aufrufen muss, während ja 1) das alles automatisch macht, richtig?


Vielen Dank für deine Hilfe!
 

semi

Top Contributor
Ich weiss nicht, was Hibernate.initialize macht, habe es noch nie verwendet und auch nicht nachgeschaut,
aber es erspart dir vermutlich die Getter-Aufrufe. Somit ist 1) und 3) das gleiche, wobei 1) weniger Getippe
bedeutet. Probiere es aus, dann weisst du mehr.

Wie sieht das Ergebnis aus, wenn du es, ohne die Daten nachzuladen, direkt serialisierst?
z.B. sowas mal zum Test und person2 betrachten. Beobachte dabei, ob die Daten beim Serialisieren
nachgeladen werden und vor allem von welchem Typ sie sind.
Code:
Person person = findById(1); // Das Objekt normal laden

ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(person);
out.close();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));

Person person2 = (Person)in.readObject();
 

sparrow

Top Contributor
Wenn ein serialisiertes Objekt wieder geladen wird kommt es zu einer LazyInitializationException wenn ich versuche auf die Liste zuzugreifen. Es funktioniert wenn ich das Objekt wieder in eine Session einhänge, aber genau das will ich ja nicht.
 

semi

Top Contributor
Aha, dann wurden die Proxies serialisiert. Die kannst du clientseitig kaum gebrauchen. Ausserdem müsste
die Implementierung cliientseitig auch bekannt sein. Klartext: Hibernate clientseitig in Classpath.
Das ist nicht so sexy. ;) Passiert Gleiches bei Hibernate.initialize(...)? Wenn ja, dann bleibt dir nichts anderes
übrig, als eine extra Query. Wenn das auch ein Problem ist, dann DTOs.
 
M

maki

Gast
initialize sorgt nur dafür, dass nur die angegebene Property/Collection initialisiert wird, nicht das ganze Objekt, dafür ist die LEFT JOIN FETCH besser geeignet.

Man braucht nicht zu DTOs zu greifen (und damit einen Rückschritt in der Entwicklung machen).

Man muss nur dafür sorgen, dass die Objekte je nach Anwendungsfall(use case) "richtig" geladen werden.
Brauche ich nicht den kompletten Objektgraphen, sondern will zB. nur eine Liste von Objekten anzeigen in der nur die als EAGER gemappte Attribute vorkommen, reichen die Proxies und die Performance geht nicht in den Keller.
Brauche ich den kompletten Objektgraphen, muss ich dafür sorgen, dass Hibernate nicht faul ist ;) am besten mit der von semi vorgestellten Syntax.

Das schwierige dabei?
Die einzelnen Use Cases zu identifizieren und entsprechende Methoden in der Business Schicht implementieren.
 
S

SlaterB

Gast
> initialize sorgt nur dafür, dass nur die angegebene Property/Collection initialisiert wird, nicht das ganze Objekt

hmm, kannst du das näher erläutern,
wenn man doch
Hibernate.initialize(object);
aufruft, also nur das Objekt übergibt?

wie genau bezeichnest du diese Aktion wenn du 'initialisiert das ganze Objekt' explizit ausschließt? ;)
 
M

maki

Gast
Aus der API Doc zu initialize: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Hibernate.html#initialize(java.lang.Object)

Force initialization of a proxy or persistent collection.

Note: This only ensures intialization of a proxy object or collection; it is not guaranteed that the elements INSIDE the collection will be initialized/materialized.
Soll heissen, wenn ich von meiner Entität eine property übergebe, welche eine Collection ist:
Code:
MyEntity myEntity = ....

initialize(myEntity.getPropertyWhichIsACollection);
Sorgt initialize dafür, dass die Collection geladen wird, aber nicht notwendigerweise auch die Objekte/Elemente in der Collection initialisiert werden, könnte nur eine Collection von Proxies dabei rauskommen... da müsste man für jedes Element der Collection initialize aufrufen.
Bei initialize wird nicht notwendigerweise der gesamte Objektgrpah initialisiert, können immer noch Proxies dabeisein.
 
S

SlaterB

Gast
dass die referenzierten Objekte nicht auch rekursiv initalisiert werden ist doch klar,
sonst hätte man ja meist mit einem Aufruf die halbe Datenbank geladen ;)

aber ich frage mich immer noch was gegen 'initialisiert das ganze Objekt' spricht,

nehmen wir mal ein Objekt A
mit lazy referenzierten Objekten B, C, D
sowie lazy referenzierten Listen von Objekten E und F

klar kann man wenn man will nur die Liste für E übergeben,
aber das ist ja nicht die Frage,
sondern man ruft
Hibernat.initialize(Object A);
auf,

dann werden doch wohl die Objekte B, C, D sowie alle referenzierten E und F geladen, oder?
habs noch nicht wirklich richtig ausprobiert, aber so bisher verstanden,

die zusätzlich geladenen Objekte sind natürlich relativ leer,
deren lazy Objekte werden wie gesagt nicht rekursiv geladen,
da ja sonst Armageddon ;)
 
M

maki

Gast
aber ich frage mich immer noch was gegen 'initialisiert das ganze Objekt' spricht,
Nun, das kommt darauf an, wie man "initialisiert" definiert ;)

dann werden doch wohl die Objekte B, C, D sowie alle referenzierten E und F geladen, oder?
habs noch nicht wirklich richtig ausprobiert, aber so bisher verstanden,
Ja, sehe ich auch so.

Manchmal braucht man wirklich das armageddon (das ganze Objekt samt aller "unterobjekte", keine Proxies), meistens jedoch nur das faule Objekt mit den Proxies.

"Armageddon" lässt sich auch durch fetchtype=eager/lazy=false in den Mappings auslösen, manchmal ist es richtig, meist Verschwendung.

Wir haben in unseren Session EJBs jeweils zwei Arten Methoden:
Diejenigen, die auch Proxies liefern, und diejeniegen, die nie Proxies liefern.
Letztere heissen load und erwarten eine ID als Parameter, liefern nur ein einziges Objekt, dafür aber alles echt.
Die anderen, hiessen irgendwas mit "List", erwarten Criterias, oder andere Suchkriterien, leifern aber keine 100% echten Objekte, sondern nur das Oberste ist initialisiert, der rest sind oft(aber nicht immer) Proxies.

Während das "Armageddon" für normale Objekte meist "nur" aus mieser Performance besteht, kann es für große Objekte, zB. Dateien die als BLOB persistiert werden, sogar zum Crash führen.
5000 Dateien mit je 20MB auf einmal in den RAM zu laden ist sicherlich keine gute Idee.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
tom.j85 Objekt in OneToOne Beziehung über http request anzeigen lassen Datenbankprogrammierung 3
C Objekte aus DB in Strings umwandeln also von List<Objekt> in String Datenbankprogrammierung 6
S Mit 2 Queries ein Objekt erstellen Datenbankprogrammierung 6
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
H JDBCODBC - Connection-Objekt Datenbankprogrammierung 3
N Java-Objekt dynamisch aus Datenbanktabelle erzeugen? Datenbankprogrammierung 4
W MySQL-Connection-Objekt übergeben Datenbankprogrammierung 2
G MySQL Zugriff auf Datenbank Objekt Datenbankprogrammierung 19
M JPA-Query - nicht das komplette Objekt Datenbankprogrammierung 4
J Derby/JavaDB NullPointerException bei VORHANDENEM EntityManager-Objekt!!! Datenbankprogrammierung 3
kirchrath Hibernate Join - angejointes Objekt wählen Datenbankprogrammierung 2
P MySQL Objekt aus BLOB auslesen Datenbankprogrammierung 3
S JPA: Objekt in Tabelle mit Composite Keys mappen (Embeddable Annotation) Datenbankprogrammierung 2
Y JPQL WHERE != Objekt Datenbankprogrammierung 10
J Datenbank: Record-Objekt Datenbankprogrammierung 2
M \t in List-Objekt Datenbankprogrammierung 5
S Java objekt in MYSQL auslesen Datenbankprogrammierung 32
M Java Objekt in Datenbank schreiben :( Datenbankprogrammierung 8
G objekt zurück setzen Datenbankprogrammierung 2
A Fehlermeldung "Objekt bereits geschlossen" Datenbankprogrammierung 3
A JDBC-Fehler "Objekt bereits geschlossen" Datenbankprogrammierung 4
Y Hibernate - 1:1 Beziehung liefert leeres Objekt Datenbankprogrammierung 19
S Hibernate - Ein Referenziertes Objekt mit Sprichern Datenbankprogrammierung 5
P [Hibernate] Objekt laden, Id ändern und speichern? Datenbankprogrammierung 2
R Hibernate speichert nur das Basis-Objekt Datenbankprogrammierung 4
M Objekt in Datenbank speichern Datenbankprogrammierung 2
J Wie kann ich in ein OLE-Objekt reinschreiben ? Datenbankprogrammierung 2
K relationale vs. objekt-orientierte Datenbank Datenbankprogrammierung 4
L Objekt in die DB speichern und die Id zurückgeben Datenbankprogrammierung 2
S Eclipselink Lazy Loading und interne iteration Verständnis Datenbankprogrammierung 1
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
I Hibernate - Best Practice für Lazy Loading Datenbankprogrammierung 3
B häppchenweises auslesen "lazy loading" von Datenbank Datenbankprogrammierung 13
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
raptorrs Plötzlich keine Verbindung zur Datenbank mehr möglich Datenbankprogrammierung 14
OnDemand SSL Verbindung zu externer DB Datenbankprogrammierung 5
C MySQL Remote Verbindung zu MariaDB Datenbankprogrammierung 11
M SQL , CSV Verbindung : Zu Umfangreicher Code durch Unwissenheit Datenbankprogrammierung 21
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
Z Beim schließen des Programms die verbindung zur DB beenden. Datenbankprogrammierung 4
Husamoli345 JSF-JDBC Verbindung Crud Datenbankprogrammierung 15
V keine Verbindung möglich (Access-DB) Datenbankprogrammierung 3
H MySQL Verbindung Datenbank und Eclipse (Java) Datenbankprogrammierung 5
M Oracle SQLException: Verbindung getrennt Datenbankprogrammierung 2
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
C Verbindung mit SQLExpress Datenbankprogrammierung 9
S E(fx)clipse Verbindung zu MS SQL Express aufbauen Datenbankprogrammierung 7
M H2 Verbindung zur Datenbank komplett schließen Datenbankprogrammierung 11
F MySQL Verbindung zum SQL-Server Datenbankprogrammierung 27
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
C datenbank verbindung config Datenbankprogrammierung 23
I MariaDB-Verbindung in JAVA Datenbankprogrammierung 11
J Verbindung aufbauen Datenbankprogrammierung 7
S DB2 Express C - keine Verbindung zur Datenbank Datenbankprogrammierung 2
I Es kann keine Verbindung zum Server aufgebaut werden Datenbankprogrammierung 12
Thallius MySQL Merkwürdiges JDBC Verhalten bei VPN Verbindung. Datenbankprogrammierung 7
P MySQL-Verbindung in anderer Klasse nutzen Datenbankprogrammierung 2
W Keine ODBC-Verbindung zur MSAccess-Datenbank Datenbankprogrammierung 2
S Auslagern der Datenbank Verbindung Datenbankprogrammierung 2
M Verbindung von Java Programm zur Acccess Datenbank (mdb-Datei) Datenbankprogrammierung 0
D NullPointerException bei DB Verbindung Datenbankprogrammierung 6
AssELAss Verbindung i5 Series 7.1 / 7.2 (DB2) mit Oracle SQL Developer Datenbankprogrammierung 3
J Verbindung zu Derby Datenbank funktioniert nicht Datenbankprogrammierung 14
M MySQL Verbindung zum Server aufbauen ohne DB ansprechen Datenbankprogrammierung 2
D Java MS Access Verbindung Datenbankprogrammierung 10
X MySQL DB-verbindung ohne JDBC/ODBC Datenbankprogrammierung 1
J Keine Verbindung zu MSSQL DB mit JDBC Datenbankprogrammierung 3
A Verbindung mit Access 2007 Datenbank herstellen Datenbankprogrammierung 1
I Datenbank Verbindung geht nicht Datenbankprogrammierung 2
N MySQL com.microsoft.sqlserver.jdbc.SQLServerException: Die Verbindung wurde geschlossen. Datenbankprogrammierung 1
1 MySQL Verbindung mit localhost als IP funktioniert, aber mit normaler IP nicht Datenbankprogrammierung 2
A Nach Export mysql Verbindung zur Datenbank nicht möglich, was tun? Datenbankprogrammierung 7
Helgon H2 Verbindung öffnen/schließen - Dauer, wann, wie lange? Datenbankprogrammierung 2
J Verbindung zu Access Datenbank Datenbankprogrammierung 15
J Verbindung zu Datenbank herstellen Datenbankprogrammierung 26
P MySQL Verbindung nach außen sehr langsam Datenbankprogrammierung 4
P JDBC Verbindung zur DB klappt nicht Datenbankprogrammierung 6
J Java - JDBC Verbindung zur Datenbank nicht möglich Datenbankprogrammierung 10
T MySQL Sichere Verbindung Datenbankprogrammierung 6
T MySQL Kann Verbindung zur MySQL Datenbank nicht herstellen. Datenbankprogrammierung 4
S Google Web Toolkit LDAP - Verbindung Datenbankprogrammierung 2
pg1337 Verbindung mit postgres - eclipse Datenbankprogrammierung 4
M Verbindung mit MSSQL hängt! Datenbankprogrammierung 2
cover1012 Derby/JavaDB Verbindung mit FTP-Server Datenbankprogrammierung 13
T NullPointerException bei Verbindung zur Datenbank Datenbankprogrammierung 4
J DB2 Verbindung zu AS400 Datenbankprogrammierung 6
F PostgreSQL JPA und Hibernate - Verbindung zur DB Datenbankprogrammierung 7
J MySQL Verbindung über JDBC scheitert immer Datenbankprogrammierung 2
M MySQL getConnection - Verbindung Problem Datenbankprogrammierung 2
T mdb Verbindung ohne Registrierung der Datenquelle im OS Datenbankprogrammierung 14
K MySQL Verbindung funktioniert in Netbeans aber .jar funktioniert nicht Datenbankprogrammierung 5
jeppi MySQL Design-Problem: DB-Verbindung herstellen und halten - JdbcRowSet / Idle-Timeout? Datenbankprogrammierung 9
S Hibernate in Verbindung mit Hsql Datenbankprogrammierung 2
D Oracle Verbindung mit Java zu Datenbank Datenbankprogrammierung 8
F MSSQL-Server Verbindung Datenbankprogrammierung 5
E Hibernate Problem bei bidirektionaler 1:n Verbindung Datenbankprogrammierung 2
DStrohma MS SQL Server 2005 + Java: Immer nur eine aktive Verbindung erlaubt? Datenbankprogrammierung 5

Ähnliche Java Themen


Oben