-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: LazyInitializationException direkt nach get()
PostPosted: Tue Jul 04, 2006 3:53 am 
Newbie

Joined: Tue Jul 04, 2006 3:24 am
Posts: 6
Guten Morgen zusammen,

ich habe hier ein wohl eher komisches Problem mit Hibernate. Vorweg, wir verwenden Hibernate über die Spring Schnittstellen - bisher ohne weitere Probleme.

Zum Problem:
Wir bekommen eine LazyInitializationException noch innerhalb des Dao's, sobald Zugriff auf eine Map, Liste oder sonst ein als Lazy definiertes Objekt erfolgt.

Die Verwaltung der Session erfolgt über das OpenSessionInView-Pattern (implementiert von Spring), d.h. ist davon auszugehen das die Session zu diesem Zeitpunkt auf jeden Fall noch vorhanden ist.

Das laden der Beans erfolgt über die get(); Methode. Testweise umgestellt auf load(); kommt die Exception sofort, auch ohne Zugriff auf die Referenzen. Komisch ist die Tatsache das wir an anderen Stellen garkeine Probleme mit Lazy haben, an anderen wiederum ebenfalls - trotz Zugriff auf das selbe Bean.

Aufgefallen ist dieser Fehler erst nach einer Umsellung des Systems. Vorher wurden sämtliche Dao's über die Transaktionssteuerung von Spring verwaltet. Zusätzlich wird die Datenbank neuerdings durch Hibernate selbst erstellt, was zuvor alles manuell geschah. Der genaue Zeitpunkt nach welcher Umstellung der Fehler auftrat lässt sich leider nicht mehr reproduzieren.


Hibernate version:
3.0.5

Datenbank:
Oracle 10i

Mapping:
<class
name="com.lp.logstarJ.modules.bk.backend.db.PaketKopfBean"
table="BK_PaketKopf">
<meta attribute="class-description">Diese Klasse verwaltet die zu kommissionierenden Pakete</meta>
<meta attribute="class-code">
<![CDATA[
/**
* Serial
*/
private static final long serialVersionUID = -7261768383838597991L;
]]>
</meta>

<id
name="paketId"
column="PaketId"
type="int">
<meta attribute="field-description">Identifier Paket-Kopf</meta>
<generator class="sequence">
<param name="sequence">BK_PaketKopf_SQ</param>
</generator>
</id>
<version
name="version"
column="version">
<meta attribute="field-description">Versions-Nummer</meta>
</version>
<many-to-one
name="firmenNr"
column="FirmenNr"
class="com.lp.logstarJ.system.shared.backend.db.FirmenBean"
lazy="proxy">
<meta attribute="field-description">Verknüpfung zur Firma</meta>
</many-to-one>
<property
name="paketNr"
column="PaketNr"
type="java.lang.String"
length="15"
update="false"
insert="true"
not-null="true">
<meta attribute="field-description">Paket-Nr. - Bei der Übernahme der Aufträge in die Kommissionierung wird das Feld mit Auftrags-Nummer belegt. Werden Pakete manuell gebildet, wird die Paket-Nr. aus einem Paket-Nr-Kreis generiert.</meta>
</property>
<property
name="prio"
column="pri"
type="java.lang.String"
length="3"
update="true"
insert="true">
<meta attribute="field-description">Priorität</meta>
</property>
<property
name="ErfassungDt"
column="ErfassungsDatum"
type="java.util.Date"
update="false"
insert="true">
<meta attribute="field-description">Erfassungsdatum</meta>
</property>
<property
name="status"
column="Sts"
type="java.lang.String"
length="2"
update="true"
insert="true">
<meta attribute="field-description">Status</meta>
</property>
<property
name="statusUnt"
column="StsUnt"
type="java.lang.String"
length="1"
update="true"
insert="true">
<meta attribute="field-description">Status Angehalten</meta>
</property>
<property
name="statusTime"
column="StsTime"
type="java.util.Date"
update="true"
insert="true">
<meta attribute="field-description">Status Timestamp</meta>
</property>
<bag
name="paketpositionen"
lazy="true">
<meta attribute="field-description">Liste der Paketpositionen</meta>
<key column="PaketId" />
<one-to-many class="com.lp.logstarJ.modules.bk.backend.db.PaketPositionBean" />
</bag>
<many-to-one
name="kommissionierer"
class="com.lp.logstarJ.modules.bk.backend.db.KommissioniererBean"
column="KomId"
cascade="all"
lazy="proxy">
<meta attribute="field-description">Enthält den zugeordneten Kommissionierer</meta>
</many-to-one>
</class>


Stack trace:
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134)
at com.lp.logstarJ.modules.bk.backend.db.KommissioniererBean$$EnhancerByCGLIB$$dfe0c2dd.toString(<generated>)
at com.lp.logstarJ.modules.bk.backend.db.dao.PaketDaoHbImpl.getPaketkopf(PaketDaoHbImpl.java:30)
at com.lp.logstarJ.modules.bk.backend.business.ServiceImpl.getPaketKopf(ServiceImpl.java:266)
at com.lp.logstarJ.modules.bk.frontend.kom.backingBeans.Auftragsdaten.getPaketKopf(Auftragsdaten.java:142)
at com.lp.logstarJ.modules.bk.frontend.kom.backingBeans.Auftragsdaten.getAuftragKopf(Auftragsdaten.java:152)
at com.lp.logstarJ.modules.bk.frontend.kom.backingBeans.Auftragsdaten.getAnzahlAuftragKopfTexte(Auftragsdaten.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.myfaces.el.PropertyResolverImpl.getProperty(PropertyResolverImpl.java:438)
at org.apache.myfaces.el.PropertyResolverImpl.getValue(PropertyResolverImpl.java:82)
at com.sun.facelets.el.LegacyELContext$LegacyELResolver.getValue(LegacyELContext.java:141)
at com.sun.el.parser.AstValue.getValue(AstValue.java:96)
at com.sun.el.parser.AstGreaterThan.getValue(AstGreaterThan.java:20)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:183)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
at com.sun.facelets.tag.TagAttribute.getObject(TagAttribute.java:233)
at com.sun.facelets.tag.TagAttribute.getBoolean(TagAttribute.java:79)
at com.sun.facelets.tag.jstl.core.IfHandler.apply(IfHandler.java:49)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:165)
at com.sun.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:94)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.tag.ui.DefineHandler.apply(DefineHandler.java:58)
at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:128)
at com.sun.facelets.impl.DefaultFaceletContext$1.apply(DefaultFaceletContext.java:253)
at com.sun.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:263)
at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:63)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:136)
at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113)
at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:408)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:442)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.lp.logstarJ.system.login.common.CheckValidAuthFilter.doFilter(CheckValidAuthFilter.java:92)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.lp.logstarJ.util.RequestTimeFilter.doFilter(RequestTimeFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)


Hoffe hier hat jemand eine hilfreiche Idee, meine gehen mir langsam aus ;)

Grüße,
Helge


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 04, 2006 8:24 am 
Newbie

Joined: Tue Jul 04, 2006 3:24 am
Posts: 6
Hallo nochmal,

wir haben noch etwas rausgefunden. Wie dem StackTrace zu entnehmen handelt es sich bei der ganzen Sache um eine Web-Anwendung. D.h. der OpenSessionInViewFilter um die Session über einen kompletten Request _und_ Response offen zu halten (unter anderem für JSF).

Jedenfalls haben wir noch rausgefunden, dass ein und die selbe Aktion in einem anderen Request und einem Refresh des Beans um der Persistenten Status wieder zu erlangen keinen Fehler gibt.
Im selben Request wo das Bean per get(); geladen wurde, bringt diese Methode eine Exception.

Gruß,
Helge


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 04, 2006 10:23 am 
Newbie

Joined: Sun Jun 25, 2006 1:08 pm
Posts: 7
Hallo Helge,

Nachdem im StackTrace gleich an erster Stelle steht: Session was closed; würde ich auch mal annehmen, dass das stimmt ;)

Um das nochmal Revue-Passieren zu lassen: Ihr habt da quasi einen WebFilter der für jeden Request die Session öffnet, dem ganzen Request über offen lässt, und nach dem Request schließt?

Könnte es vielleicht sein, dass ihr mit Frames arbeitet? Bei zwei Frames hättet ihr ja dann quasi auch zwei Requests. Dann könnte es sein, dass (jenachdem welcher Frame schneller ist) der die Session schließt und der andere schaut ins Leere...

So ein ähnliches Problem hatte ich zumindest mal.

grüße Harald


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jul 05, 2006 4:14 am 
Newbie

Joined: Tue Jul 04, 2006 3:24 am
Posts: 6
Hallo,

danke für die Antwort. Nein, Frames benutzen wir nicht.
Glücklicherweise ist es mir gestern Abend noch gelungen das Problem ein wenig mehr einzukreisen. Wir gehen beim Zugriff auf Hibernate über das HibernateTemplate von Spring. Als ich testweise direkt über die Hibernate SessionFactory ging, tauchte der Fehler an dieser Stelle nicht mehr auf.

Problematisch dabei ist, in wie weit das HibernateTemplate in die ganzen Transaktionen über Spring einwirkt und benötigt wird.

Weiterhin ist mir im Debugmodus aufgefallen, das häufig zeilen von Hibernate mit "closing session" vorkommen.

z.B.:
2006-07-04 16:40:02,438 DEBUG [org.hibernate.impl.SessionImpl] - closing session

Auch hier denke ich, dadurch das Hibernate komplett über Spring verwaltet wird, das Spring irgendwo die Session schliessen wird. Dummerweise wohl erst seitdem wir die Transaktionen in diesem Bereich entfernt haben.
Aber ich denke das ist eher ein Fall für das Spring-forum.

Ausser jemand hat mit Spring und Hibernate zusammen bereits erfahrungen und kann dazu ein wenig was sagen :)

Grüße,
Helge


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jul 05, 2006 6:06 pm 
Newbie

Joined: Sun Jun 25, 2006 1:08 pm
Posts: 7
Ich bin jetzt nicht so der Spring-Guru, aber ich nehma mal an das HibernatTemplate macht nix anderes als:

- Session öffnen
- Transaction starten
- irgendwas machen
- Transaction commiten
- Session schließen

Das widerspricht dann aber der Strategie die Session über den Request hinweg offen zu lassen.

DH, mein Tipp: Falls ich soweit Recht habe, dann zuerst mal schauen ob HibernateTemplate so konfigurieren kannst, dass es die Session nicht schließt, und sonst einfach nicht verwenden ;)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 06, 2006 9:44 am 
Newbie

Joined: Tue Jul 04, 2006 3:24 am
Posts: 6
ja, wir haben mitlerweile rausgefunden, dass das HibernateTemplate die Session automatisch schliesst, sofern die Methoden unter keiner Transaktion laufen. Legt man eine Transaktion dafür an, bleibt die Session weiterhin geöffnet. Zumindest steht dies so in der Dokumentation.

Damit scheint das Problem gelöst. Wenn auch weniger schön.

Aber vielen dank für die Bemühungen.

Gruß,

Helge


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.