Hibernate Session: Wie in alle Klassen

Status
Nicht offen für weitere Antworten.

smung

Mitglied
Hi, ich habe mal eine Frage wie ihr das handhabt.
Ich baue mir in meiner Start Klasse eine Hibernate session auf. Wie realiesiert ihr das, das alle auf diese session zugreifen können. Also alle Methoden und Klassen?. Reicht ihr die Session weiter beim instanziieren der Klassen? Reicht ihr die Main weiter und lasst die session public?

Wie macht ihr das?

gruß

smung
 
G

Guest

Gast
Ja, Spring ist ein Framework das du einfach per jar in dein Projekt einbinden kannst.
Spring nimmt dir u.a. genau diese Aufgabe ab, indem du nur noch deklarativ per Annotations "erklärst", das ein bestimmtes Objekt von einer Klasse benötig wird. Spring stellt es dir dann automatisch zur Verfügung.
 

byte

Top Contributor
Die Hibernate Session sollte kurzlebig sein. Du solltest sie also öffnen, wenn Du sie brauchst und schließen, wenn sie nicht mehr gebraucht wird. Stattdessen machst Du die SessionFactory Deinen Objekten zugänglich. Darüber können sie sich bei Bedarf eine Session holen.

Solltest Du doch mit nur einer oder wenigen Sessions arbeiten wollen, dann solltest Du auf den Sesssion Cache achten. Diese wird irgendwann voll laufen, wenn die Session immer offen bleibt.

Wenn Du Spring verwendest, brauchst Du Dich um die Sessions gar nicht mehr zu kümmern. Stattdessen verwendest Du das HibernateTemplate. Das bietet viele nützliche Hilfsmethoden und übernimmt das Session-Management für Dich.
 

ARadauer

Top Contributor
hat jemand schon eine desktop anwendung realisiert?

wie macht ihr das? ich kann ja nicht einfach hergehen und sagen O von Klasse A braucht O von Klasse B. Dann instazier ich mir ein A.. in so einem Fall hat dies ja kein B gesetzt. Ausser ich hohl mir A vom ApplicationContext oder A wird sowieso von Spring instaziert.... Haltet ihr euch den ApplicationContext irgendwo in einer static Variable?

Ich hab da eine kleine Beispielapplikation von IBM, in der eigntlich alle Kern Objekte von Spring gesetzt werden, das halt ich aber für einwenig übertrieben. Ich möchte bei einer 10k Klassen Applikation diese xml Datei nicht warten müssen. Ich möchte mir nur in meine Modelklassen meine DAOs inizieren.. dazu brauch ich aber irgendow zentral die Referenz auf den ApplikationContext oder?
 

ARadauer

Top Contributor
hat jemand schon eine desktop anwendung realisiert?

wie macht ihr das? ich kann ja nicht einfach hergehen und sagen O von Klasse A braucht O von Klasse B. Dann instazier ich mir ein A.. in so einem Fall hat dies ja kein B gesetzt. Ausser ich hohl mir A vom ApplicationContext oder A wird sowieso von Spring instaziert.... Haltet ihr euch den ApplicationContext irgendwo in einer static Variable?

Ich hab da eine kleine Beispielapplikation von IBM, in der eigntlich alle Kern Objekte von Spring gesetzt werden, das halt ich aber für einwenig übertrieben. Ich möchte bei einer 10k Klassen Applikation diese xml Datei nicht warten müssen. Ich möchte mir nur in meine Modelklassen meine DAOs inizieren.. dazu brauch ich aber irgendow zentral die Referenz auf den ApplikationContext oder?
 

byte

Top Contributor
A, B, O, ... ist mir jetzt zu wirr. Drück Dich mal klarer aus. ;)

Normalerweise brauchst Du nirgends den ApplicationContext verteilen, Du kannst doch direkt die Beans injizieren. Falls es doch nicht anders geht, dann implementierst Du das Interface ApplicationContextAware, um den ApplicationContext in Deiner Klasse bekannt zu machen.

Ich möchte mir nur in meine Modelklassen meine DAOs inizieren..
Das ist keine gute Idee. Erstens haben DAOs nix im Business Model zu suchen und zweitens werden die Model-Objekte idR vom OR-Mapper (z.B. Hibernate) generiert. Da müsstest Du schon mit Bytecode-Instrumentation (in Spring Load-Time Weaving genannt) arbeiten, um in solche Objekte (die nicht von Spring erzeugt werden) etwas zu injizieren.
 

ARadauer

Top Contributor
Das ist keine gute Idee. Erstens haben DAOs nix im Business Model zu suchen und zweitens werden die Model-Objekte idR vom OR-Mapper (z.B. Hibernate) generiert.

hab mich da falsch ausgedrückt.... also in die Richtung MVC, mein Model bekommt vom Controller die anweisung daten zu laden, Model benutzt DAO um Datenobjekten über Hibernate zu laden, Datenobjekte werden in Model gehalten, Model informiert GUI über änderung, GUI stellt Daten aus dem Model dar. ->>Mit Model hab ich jetzt nicht meine Fachobjekte gemeint.

ApplicationContextAware.. muss ich mir ansehen.

A, B, O... mhn... ok nochmal: mein Service möchte von Spring ein DAO gesetzt bekommen. wenn ich meinen Service mit new instanziere ist das DAO natürlich nicht gesetzt. Wenn aber Spring meinen Service instaziert (über ApplicationContext#getBean("service1") oder weil es schon von einer anderen bean referenziert wurde) dann ist das DAO schon gesetzt... Habe ich jetzt mehrere Services die ich mit new instazieren will, benötige ich meiner meiner Meinung nach eine zentrale Referenz auf den ApplicationContext.... kann aber auch nonsens sein, beschäftige mich noch nicht so lange mit dem thema....

wenn ich ApplicationContextAware implementiere, wird mir dann der Context auch gesetzt wenn ich das Objekt mit new instaziere?
 

byte

Top Contributor
Ich mache das bei mir derzeit so, dass ich auf dem Swing Client genau ein Singleton-Objekt (ClientContext) definiert habe, das Zugriff auf alle global verfügbaren Objekte bietet. Dieser ClientContext (hat jetzt nix mit Spring zu tun) wird beim Laden des Clients initialisiert und lädt unter anderem den Spring ApplicationContext. Man kann also über diesen ClientContext an die Spring Beans dran kommen.
Bei mir bekomme ich darüber Zugriff auf meine Remote Services (in meinem Fall ist es eine 3-Schicht-Architektur). Du könntest auf diese Weise Deine DAOs verfügbar machen. Auf diese Weise kannst Du Deinen Client auf herkömmlichen Wege konzipieren. Der Einsatz von Spring und DI beschränkt sich dann dabei lediglich auf die Persistenz (DAOs, Transaktionen).

ApplicationContextAware ist natürlich nur für durch Spring erzeugte Beans zu gebrauchen, insofern bringt Dir das hier nichts.
 

ARadauer

Top Contributor
Ich mache das bei mir derzeit so, dass ich auf dem Swing Client genau ein Singleton-Objekt (ClientContext) definiert habe, das Zugriff auf alle global verfügbaren Objekte bietet. Dieser ClientContext (hat jetzt nix mit Spring zu tun) wird beim Laden des Clients initialisiert und lädt unter anderem den Spring ApplicationContext. Man kann also über diesen ClientContext an die Spring Beans dran kommen.

ok verstehe, so ähnlich habs ichs jetzt auch gemacht. wollt nur fragen ob das ok ist.

Zugriff auf meine Remote Services
in welcher form sind diese Services implementiert, wenn ich fragen darf?
 

byte

Top Contributor
Die Serveranwendung ist mittels Spring WebApplicationContext auf einem Tomcat deployed. Die Services werden mittels HttpInvoker dem Client bereit gestellt.
 

BjörnBu

Aktives Mitglied
ARadauer hat gesagt.:
Das ist keine gute Idee. Erstens haben DAOs nix im Business Model zu suchen und zweitens werden die Model-Objekte idR vom OR-Mapper (z.B. Hibernate) generiert.

hab mich da falsch ausgedrückt.... also in die Richtung MVC, mein Model bekommt vom Controller die anweisung daten zu laden, Model benutzt DAO um Datenobjekten über Hibernate zu laden, Datenobjekte werden in Model gehalten, Model informiert GUI über änderung, GUI stellt Daten aus dem Model dar. ->>Mit Model hab ich jetzt nicht meine Fachobjekte gemeint.

ApplicationContextAware.. muss ich mir ansehen.

A, B, O... mhn... ok nochmal: mein Service möchte von Spring ein DAO gesetzt bekommen. wenn ich meinen Service mit new instanziere ist das DAO natürlich nicht gesetzt. Wenn aber Spring meinen Service instaziert (über ApplicationContext#getBean("service1") oder weil es schon von einer anderen bean referenziert wurde) dann ist das DAO schon gesetzt... Habe ich jetzt mehrere Services die ich mit new instazieren will, benötige ich meiner meiner Meinung nach eine zentrale Referenz auf den ApplicationContext.... kann aber auch nonsens sein, beschäftige mich noch nicht so lange mit dem thema....

wenn ich ApplicationContextAware implementiere, wird mir dann der Context auch gesetzt wenn ich das Objekt mit new instaziere?

Ich mache das so - (credits an dieser Stelle an einen Artikel im Javamagazin von Christian Dupuis, hab ich mir leider nicht selbst ausgedacht):

Einen Aspect im Spring Context registrieren und ihm das DAO injecten.
Als Pointcut den Constuktor des Services (oder in meinem Fall, der sicher auch häufig vor kommt, des Domain Objektes) definieren
In einem after-advice das DAO setzen.

genau das selbe verhalten erreichst du aber auch, wenn du deinen Service mit @Configurable annotierst und das DAO mit @Autowired injecten lässt. Die Nutzuing von @Configurable setzt aber leider voraus, dass beim JVM start ein -javaagent gesetzt wird. Deshalb habe ich persönlich immer einfach einen eigenen Aspekt geschrieben, der das DAO (oder was auch immer) setzt.

LG Björn


_____________


Nochmal was an dne Thread-Ersteller:

Wenn du keine Lust hast dich extra noch mit Spring zu beschäftigen, lass es vorerst einfach. Das kannst du später immernoch machen. Im Falle von Hibernate kannst du deine SessionFactory (lieber nicht eine explizite Session) ruhig als Singleton deklarieren und erstmal damit arbeiten. Mit Dependency Injection durch z.B. Spring ist's dann schönen und irgendwann auch einfacher und schneller gemacht. Aber für's erste spricht - meiner Meinung nach - wenig gegen 'nen Singleton
 

byte

Top Contributor
BjörnBu hat gesagt.:
Ich mache das so - (credits an dieser Stelle an einen Artikel im Javamagazin von Christian Dupuis, hab ich mir leider nicht selbst ausgedacht):

Einen Aspect im Spring Context registrieren und ihm das DAO injecten.
Als Pointcut den Constuktor des Services (oder in meinem Fall, der sicher auch häufig vor kommt, des Domain Objektes) definieren
In einem after-advice das DAO setzen.

genau das selbe verhalten erreichst du aber auch, wenn du deinen Service mit @Configurable annotierst und das DAO mit @Autowired injecten lässt. Die Nutzuing von @Configurable setzt aber leider voraus, dass beim JVM start ein -javaagent gesetzt wird. Deshalb habe ich persönlich immer einfach einen eigenen Aspekt geschrieben, der das DAO (oder was auch immer) setzt.

Vielleicht habe ich Aradauer auch falsch verstanden, aber es geht doch darum, dass er seine DAOs in Objekten benutzen möchte, die nicht von Spring instanziert wurden.
Ich verstehe nicht ganz, wie Du das mit AOP erreichen willst, ohne Load-Time Weaving (spring-agent.jar) einzusetzen? Es gibt doch nur zwei Möglichkeiten, AOP zu benutzen: entweder mit Proxies oder mit Bytecode-Instrumentation. Letzteres geht nur mit dem spring-agent.jar und Proxies funktionieren nur für Objekte, die auch von Spring erzeugt werden.

Domain Objekte werden ja idR nicht durch Spring erzeugt sondern vom OR-Mapper (z.B. Hibernate). Wie willst Du da Aspekte dran hängen, ohne Load-Time-Weaving zu benutzen? Wüsste nicht dass das mit Proxies zu bewerkstelligen ist, aber lasse mich gerne eines besseren belehren. :)
 

BjörnBu

Aktives Mitglied
der Joinpoint wird fest zur compile-time geweavt. Sprich nach jedem Konstruktor Aufruf setzt der Aspekt das DAO
Der Aspekt selber kann aber ruhig am Anfang instanziert und von Spring verwaltet werden. Dem injecte ich das DAO. Fest in den Bytecode reinmanipuliert ist nur die Logik des Setzens.

Ohne Spring würde null als DAO gesetzt werden. Mit Spring hat der Aspekt das DAO als Referenz und setzt es wunderbar. Habe ich definitiv schon so in der Praxis - bei von Hibernate instanzierten Domain Objekten - gemacht
 

byte

Top Contributor
BjörnBu hat gesagt.:
der Joinpoint wird fest zur compile-time geweavt. Sprich nach jedem Konstruktor Aufruf setzt der Aspekt das DAO
Sorry, habs immernoch nicht verstanden: Wie kriegst Du den Joinpoint in die Hibernate Objekte ohne den Einsatz von spring-agent.jar? JDK-Proxies werden doch nur erzeugt, wenn die Objekte als Spring Beans konfiguriert sind? ???:L Für alles weitere braucht man AspectJ / spring-agent.jar.
 

BjörnBu

Aktives Mitglied
Achso sorry. Ja, ich habe AspectJ genutzt und die Aspekte als beans mit factory-method="apspectOf" definiert. Trotzdem kommt es ohne load time weaving aus.

Sorry für die Verwirrung ich habe mir irgendwie angewöhnt AspectJ statt Spring AOP zu nutzen.
 

byte

Top Contributor
Achso ok. Ich wusste gar nicht, dass man AspectJ auch ohne spring-agent.jar benutzen kann. Werde mir das beizeiten mal genauer anschauen. :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
I JPA / Hibernate "Predicate" kombinieren in der gleichen Query Java Basics - Anfänger-Themen 1
I BLOB / CLOB und Hibernate... Ratschläge benötigt Java Basics - Anfänger-Themen 10
B HQL / Hibernate, GroupBy und Ausgabe als Double Java Basics - Anfänger-Themen 1
D hibernate annotation Java Basics - Anfänger-Themen 2
D hibernate: string vs setparameter Java Basics - Anfänger-Themen 1
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Java Basics - Anfänger-Themen 4
Todesbote Int Array mit Hibernate in Datenbank speichern. Java Basics - Anfänger-Themen 2
DStrohma Best Practice Hibernate für kleine Anwendung nutzen? Java Basics - Anfänger-Themen 4
I Hibernate Java Basics - Anfänger-Themen 4
T Hibernate Fehlermeldung Java Basics - Anfänger-Themen 9
D [Hibernate] Objektinhalte auslesen Java Basics - Anfänger-Themen 8
N Hibernate "Hello World" Tutorial gesucht Java Basics - Anfänger-Themen 9
F Logging von Hibernate-Statements und Glassfish Java Basics - Anfänger-Themen 2
G Maps und Hibernate - Performancefrage Java Basics - Anfänger-Themen 2
G hibernate . tutorial prob . Java Basics - Anfänger-Themen 4
G org.hibernate.MappingException:An AnnotationConfiguration. Java Basics - Anfänger-Themen 3
G [Hibernate] Node to traverse cannot be null Java Basics - Anfänger-Themen 3
G java.lang.IllegalArgumentException -> Hibernate Java Basics - Anfänger-Themen 2
G Hibernate, JDO und Alternativen Java Basics - Anfänger-Themen 4
G [Hibernate] Richtiger ColumnType Java Basics - Anfänger-Themen 2
G [Hibernate] Aus SQL-Statement Entities erzeugen Java Basics - Anfänger-Themen 2
G [Hibernate] Constraints über mehrere Tabellen Java Basics - Anfänger-Themen 2
G [Hibernate] Could not find a setter for property Java Basics - Anfänger-Themen 2
M [Hibernate] "Illegal start of expression"-Fehler b Java Basics - Anfänger-Themen 2
B Hibernate - DB2 - Java Java Basics - Anfänger-Themen 3
M [Hibernate]: Cascade-Frage Java Basics - Anfänger-Themen 4
M [Hibernate] Speichern von ManyToOne-Beziehungen in der DB Java Basics - Anfänger-Themen 12
G JTable aus Hibernate Zeile löschen Java Basics - Anfänger-Themen 4
H [Hibernate] HibernateSessionFactory Pfad setzen Java Basics - Anfänger-Themen 4
G [Hibernate] Dynamischer Datenbankpfad Java Basics - Anfänger-Themen 4
G [Hibernate] Laden aus DB funktioniert nicht Java Basics - Anfänger-Themen 8
G [Hibernate] Beschränkte Selektion Java Basics - Anfänger-Themen 2
G [Hibernate] StaleStateException beim Löschen Java Basics - Anfänger-Themen 3
G Einfacher Anfang mit Hibernate Java Basics - Anfänger-Themen 4
F [Hibernate] Debug INFO Einstellungen Java Basics - Anfänger-Themen 5
F [Hibernate] Alle Objekte laden aus der DB laden Java Basics - Anfänger-Themen 6
F [Hibernate] Id aus DB auslesen Java Basics - Anfänger-Themen 5
C Hibernate und Mandantenfähigkeit Java Basics - Anfänger-Themen 7
G hibernate tutorial Java Basics - Anfänger-Themen 3
R Verständnisproblem mit Hibernate Java Basics - Anfänger-Themen 2
N Hibernate will nicht so wie ich Java Basics - Anfänger-Themen 4
H What is the Life Cycle of an Object Created Within/Outside of a Servlet? Will that item be destroyed after the session ends? Java Basics - Anfänger-Themen 1
F Session wird mehrfach erzeugt Java Basics - Anfänger-Themen 11
B Jsoup: gleiche Session nutzen Java Basics - Anfänger-Themen 0
J HTTP Request auf eine PHP Session Java Basics - Anfänger-Themen 1
V JSP Session ID wechselt andauernd Java Basics - Anfänger-Themen 5
D Session Öffnen Java Basics - Anfänger-Themen 11
S URL bei abgelaufener Session Java Basics - Anfänger-Themen 2
D Session halten . blos wie? Java Basics - Anfänger-Themen 2
H ist eine "neue Session" für Mail möglich? Java Basics - Anfänger-Themen 3
F Session Cookies löschen Java Basics - Anfänger-Themen 4
M JavaApplet: Variable in Session speichern o.Ä? Java Basics - Anfänger-Themen 10
P Session-ID Ablaufzeit festlegen Java Basics - Anfänger-Themen 3
D Session Attribute in JSP ausgeben???? Java Basics - Anfänger-Themen 3
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
missy72 Methoden Alle rekusiven Aufrufe abbrechen Java Basics - Anfänger-Themen 21
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
E Select nimmt nicht alle Where /AND befehlen an Java Basics - Anfänger-Themen 4
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
R Methoden Eclipse schlägt mir nicht alle Möglichkeiten vor Java Basics - Anfänger-Themen 4
melisax Alle Möglichkeiten eines Wortes angeben Java Basics - Anfänger-Themen 3
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
crrnogorka Letzte Zeile einer Tabelle "überschreibt" alle anderen Zeilen Java Basics - Anfänger-Themen 1
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
H Alle Geraden zahlen bis 10 ausgeben Java Basics - Anfänger-Themen 11
L Alle Ziele in einem Raster abknallen Java Basics - Anfänger-Themen 17
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
K Array alle Werte aufsummieren und ausgeben Java Basics - Anfänger-Themen 6
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
L Wie vergrößere ich ein Rechteck in alle Richtungen um eins und bekomme dessen Rand? Java Basics - Anfänger-Themen 2
L Breadth-First Search statt einem Pfad, alle Pfade herausfinden Java Basics - Anfänger-Themen 4
X Erste Schritte String: Alle doppelten Leerzeilen entfernen Java Basics - Anfänger-Themen 21
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
Kirby.exe Alle möglichen Error Möglichkeiten abfangen Java Basics - Anfänger-Themen 33
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
V Erste Schritte for-Schleife; Ausgabe soll alle 5 Sekunden erfolgen. Java Basics - Anfänger-Themen 4
A Alle true Werte eines boolean Arrays herausfiltern Java Basics - Anfänger-Themen 19
D Alle Möglichkeiten, n-Anzahl aus Elementen aus einem Array zu wählen, ausgeben? Java Basics - Anfänger-Themen 23
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
J Erste Schritte Alle möglichen ausgaben von 5 Zahlen als Vector Java Basics - Anfänger-Themen 7
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben