-->
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.  [ 7 posts ] 
Author Message
 Post subject: default-lazy Einstellung mit Annotations?
PostPosted: Tue Mar 04, 2008 8:32 am 
Newbie

Joined: Mon May 14, 2007 5:49 am
Posts: 17
Hallo Zusammen,

ich habe ein kleines Problem mit Annotations (mal wieder). Folgende Situation:

Ich habe mein Business Objects die alle von einer BaseEntity erben. Die BaseEntitiy sieht so aus (Fokus auf der Methode isNew):

Code:
@MappedSuperclass
public abstract class BaseEntity {
   
   ...

   @Transient
   public boolean isNew() {
      return (this.id == null);
   }
}


Die Methode isNew benötige ich in meinen JSPs um zu schauen ob das Objeckt neu ist oder nicht:

userForm.jsp:

Code:
<c:choose>
   <c:when test="${user.new}">
      <fmt:message key="user.management.form.user.title.new.user" />
   </c:when>
   ...


Folgende Exception wird geworfen:

SCHWERWIEGEND: could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at my.package.business.objects.User$$EnhancerByCGLIB$$f8eb70da.isNew(<generated>)


Ich habe mich bis jetzt bei meiner Anwendung sehr stark am Petclinic Beispiel von Spring MVC orientiert. Der einzige Unterschied liegt darin, dass ich Annotations benutze und das PetClinic Beispiel mit einer XML Config Mapping Datei für Hibernate arbeitet.

In dieser Datei wird im Petclinic Beispiel auch das default-lazy auf false gestellt.

Code:
<hibernate-mapping auto-import="true" default-lazy="false">


Ich habe bereits hier http://forum.hibernate.org/viewtopic.php?t=984367 nach gefragt wie ich das mit Annotations einstellen kann. Leider bis jetzt keine Antwort bekommen.

Frage nun hier: Welche Annotations muss ich benutzen damit es funktioniert. Ich verstehe eh nicht so ganz warum ich diese Exception bekomme, da ich nichts nachladen will. Und darum geht es doch grundsätzlich bei der Lazy Einstellung oder habe ich das falsch verstanden?

Vielleicht hat jemand von euch Lust mir zu helfen oder hat einen kleinen Tipp für mich. Bin für alles dankbar.

Vielen Dank an euch.

Viele Grüße
Oliver


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 04, 2008 4:25 pm 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Die von dir zitierte Default-Einstellung für alle Mappings auf Lazy=true/false kenne ich zwar nicht; ich denke aber, dass diese globale Einstellung eh ein schlechte Idee ist.

Du solltest das bei deinen einzelnen Entities selber hinterlegen. Mit Annotations gibt es bei Referenzen auf andere Entities (oder auf Collections von solchen) immer die Möglichkeit, den Fetch-Typ anzugeben. Bei JPA heißt der entweder FetchType.LAZY oder FetchType.EAGER (..., fetch=FetchType.EAGER).

Die Exception sagt, dass du eben mit LAZY fährst und deine Anwendung beim Zugriff auf eine solche Referenz nur einen Proxy vorfindet, der außerhalb der Session /PersistentContext nicht mehr aufgelöst werden kann.

Carlo
---------------
spendier mir einen Credit, wenn's geholfen hat.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 05, 2008 3:07 am 
Newbie

Joined: Mon May 14, 2007 5:49 am
Posts: 17
carlolf wrote:
Du solltest das bei deinen einzelnen Entities selber hinterlegen. Mit Annotations gibt es bei Referenzen auf andere Entities (oder auf Collections von solchen) immer die Möglichkeit, den Fetch-Typ anzugeben. Bei JPA heißt der entweder FetchType.LAZY oder FetchType.EAGER (..., fetch=FetchType.EAGER).


Diese Einstellung kenne ich ... aber das "Problem" ist ja hier, dass es keine Collection bzw. Referenz auf eine andere Entity ist.

Er meckert ja bei der Methode isNew ... die hat ja mit den anderen Entities nichts zu schaffen. :(


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 05, 2008 3:44 am 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
KrustyDerClown wrote:

Er meckert ja bei der Methode isNew ... die hat ja mit den anderen Entities nichts zu schaffen. :(


Komisch: der Zugriff auf die ID sollte eigentlich nie eine LazyInitializationException auslösen! Ich denke, dass der Zugriff auf User selber das Problem ist.

PS: dein Code zeigt mir nebenbei, dass es doch von Vorteil ist, das Mapping auf den Attributen zu machen und nicht über den Methoden. Jedenfalls ist mir nicht durchsichtig, welche Seiteneffekte z.B. '@Transient ' auf einer Methode eventuell auslöst.

Carlo


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 05, 2008 4:16 am 
Expert
Expert

Joined: Thu Jul 05, 2007 9:38 am
Posts: 287
carlolf wrote:
KrustyDerClown wrote:
Der Zugriff auf die ID sollte eigentlich nie eine LazyInitializationException auslösen!


Ich weiß zwar auch nicht so genau warum, aber das kann öfter mal vorkommen.

Zum ursprünglichen Problem:

Wenn du
Hibernate.initialize(proxy)
aufrufst, solange du die Session noch hast, sollte die Exception verschwinden

_________________
Please rate useful posts.


Schauderhaft: Softwaredevelopment, Projectmanagement, Qualitymanagement and all things "schauderhaft"


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 05, 2008 2:53 pm 
Newbie

Joined: Mon May 14, 2007 5:49 am
Posts: 17
Hat leider beides nichts geholfen. :(

Bin echt verzweifelt.

Es muss doch auch mit Annotations funktionieren!!! Alternativ könnte ich auf das XML Config File wechseln ... dann würde es gehen ... aber das kann ja eigentlich nicht die Lösung sein.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Mar 10, 2008 12:32 pm 
Beginner
Beginner

Joined: Wed Nov 21, 2007 8:04 am
Posts: 27
Die Fehlermeldung sagt doch, Dein Objekt sei nicht initialisiert. Das einzige was du machst ist der Aufruf von isNew(), richtig? Dann folgt doch, dass das Objekt, auf dem zu isNew() aufrufst, nicht initilisiert ist.

Hibernate kann nicht wissen, dass Du in isNew() nur auf die Objektidentitaet zugreifen willst, und versucht daher den Proxy zu initialisieren, was schiefgeht, weil Du keine Session mehr hast.

==> Sorg dafuer, dass das Objekt rechtzeitig geladen wird, oder schreib die isNew-Methode um, damit sie mit nicht initialisierten Objekten klarkommt.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 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.