Hallo Community,
ich habe mal wieder eine Frage bezüglich Hibernate.
Wie ich zu begin meiner einarbeitung in Hibernate gelesen hatte, soll eine Session immer nur eine kurze Lebensdauer haben.
Das habe ich auch so umgesetzt, indem ich in jeder Methode, die in einem DAO-Objekt ausgeführt werden, eine neue Session zur verfügung Stelle und diese am Ende der Methode entsprechend wieder schließe.
Das hat bisher auch immer wunderbar geklappt und ich war zufrieden mit Ergebnis und Performance.
Unter meinen DAO-Methoden gibt es nun auch folgende Methode:
Hierbei wird anhand von Suchkriterien ein Criteria zusammengestellt und dann die entsprechende Abfrage ausgeführt.
Die Methode an sich, tut genau das was Sie soll.
Nun zu meinem Problem,
Es gibt Situationen in meinem Programm, bei denen bei dem Aufruf dieser Methode ein Array mit 2000 Filialen zurückgegeben wird.
Nun muss ich mir dann die Daten zu diesen Filialen nehmen und in einer Tabelle anzeigen.
Da meine Filial-Klasse auch Collections beinhaltet die den FetchType "LAZY" haben, muss ich entsprechend eine neue Session öffnen und die Filiale aktualisieren, da ich sonst eine Exception bekomme "keine Session vorhanden, oder Session geschlossen" (oder so ähnlich)
Ich hatte schonmal in der obigen Methode das "session.close" weggelassen. Dann musste ich später keine neue Session aufbauen und mein Filialobjekt auch nicht aktualisieren.
--> Daten deutlich schneller vorhanden.
Meine Frage ist es nun, wie ich die Session besser managen kann, damit ich eben nicht jedes dieser 2000 Filialobjekte erneut aktualisieren muss, um an die Collections zu kommen.
Rein von der theorie müsste doch aber mein obiger Ansatz stimmen, am Ende der Methode die Session zu schließen, oder sehe ich das falsch?
Ich hoffe mein Problem ist verständlich beschrieben.
Und danke schonmal für jede Antwort
ich habe mal wieder eine Frage bezüglich Hibernate.
Wie ich zu begin meiner einarbeitung in Hibernate gelesen hatte, soll eine Session immer nur eine kurze Lebensdauer haben.
Das habe ich auch so umgesetzt, indem ich in jeder Methode, die in einem DAO-Objekt ausgeführt werden, eine neue Session zur verfügung Stelle und diese am Ende der Methode entsprechend wieder schließe.
Das hat bisher auch immer wunderbar geklappt und ich war zufrieden mit Ergebnis und Performance.
Unter meinen DAO-Methoden gibt es nun auch folgende Methode:
Java:
public Object[] searchKunde(Object[] searchData) {
Object[] filialen = null;
Session session = null;
session = HibernateUtil.getSession();
try {
Criteria crit = session.createCriteria(Filiale.class);
String keineCrit = crit.toString();
crit = searchKundeOrt((String) searchData[KDNR],
(String)searchData[BEZ], (String)searchData[ORT], crit);
crit = searchKundeUBranche((String) searchData[KDNR],
(Unterbranche[]) searchData[BRANCHE], crit);
crit = searchKundeByKontakt(crit, (Integer[]) searchData[KONTIDS]);
crit = searchKundeByStatus(crit, (Object[]) searchData[STATUS]);
crit = searchKundeByKreis(crit, (Object[]) searchData[KREIS]);
crit = searchKundeByLand(crit, (Object[]) searchData[LAND]);
crit = searchKundeByBundesland(crit, (Object[]) searchData[BLAND]);
crit = searchKundeByKategorie(crit, (Object[]) searchData[KATEGOR]);
crit = searchKundeByAdressherkunft(crit, (Object[]) searchData[ADRHERK]);
crit = searchKundeVertriebsschiene(crit, (Object[]) searchData[VERTSCH]);
crit = searchKundeSoftware(crit, (Object[]) searchData[SOFTWAR]);
crit = searchKundeSystemplattform(crit, (Object[]) searchData[HARDWAR]);
crit = searchKundeVerbaende(crit, (Object[]) searchData[VERBAND]);
crit = searchKundeNrVonBis(crit, (String) searchData[KDNRVON],
(String) searchData[KDNRBIS]);
crit = searchKundePLZVonBis(crit, (String) searchData[PLZVON],
(String) searchData[PLZBIS]);
crit = searchKundeWdhVonBis(crit, (String) searchData[WDHVON],
(String) searchData[WDHBIS]);
crit = searchKundeUmsatzVonBis(crit, (String) searchData[UMSATZVON],
(String) searchData[UMSATZBIS]);
crit = searchKundeMaAnzVonBis(crit, (String) searchData[MAANZVON],
(String) searchData[MAANZBIS]);
crit = searchKundeFlaecheVonBis(crit, (String) searchData[FLAECHEVON],
(String) searchData[FLAECHEBIS]);
crit = searchKundeFilAnzVonBis(crit, (String) searchData[FILANZVON],
(String) searchData[FILANZBIS]);
crit = searchKundeZeitraumKontaktVonBis(crit,
(String) searchData[KONTZEITVON], (String) searchData[KONTZEITBIS]);
crit = searchKundeByVertBeauf(crit, (Object[]) searchData[VERTBEAUF]);
if (searchData[WERBESE] != null && searchData[KWERBSE] != null) {
crit = searchKundeWerbesendung(crit, (boolean) searchData[WERBESE],
(boolean) searchData[KWERBSE]);
}
String text = crit.toString();
if (!text.equals(keineCrit)) {
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<?> domainListe = crit.list();
filialen = domainListe.toArray();
} else {
filialen = new Object[0];
}
} catch (Exception e) {
System.out.println(e.getMessage());
filialen = new Object[0];
} finally {
session.close();
}
return filialen;
}
Die Methode an sich, tut genau das was Sie soll.
Nun zu meinem Problem,
Es gibt Situationen in meinem Programm, bei denen bei dem Aufruf dieser Methode ein Array mit 2000 Filialen zurückgegeben wird.
Nun muss ich mir dann die Daten zu diesen Filialen nehmen und in einer Tabelle anzeigen.
Da meine Filial-Klasse auch Collections beinhaltet die den FetchType "LAZY" haben, muss ich entsprechend eine neue Session öffnen und die Filiale aktualisieren, da ich sonst eine Exception bekomme "keine Session vorhanden, oder Session geschlossen" (oder so ähnlich)
Ich hatte schonmal in der obigen Methode das "session.close" weggelassen. Dann musste ich später keine neue Session aufbauen und mein Filialobjekt auch nicht aktualisieren.
--> Daten deutlich schneller vorhanden.
Meine Frage ist es nun, wie ich die Session besser managen kann, damit ich eben nicht jedes dieser 2000 Filialobjekte erneut aktualisieren muss, um an die Collections zu kommen.
Rein von der theorie müsste doch aber mein obiger Ansatz stimmen, am Ende der Methode die Session zu schließen, oder sehe ich das falsch?
Ich hoffe mein Problem ist verständlich beschrieben.
Und danke schonmal für jede Antwort