-->
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.  [ 3 posts ] 
Author Message
 Post subject: org.hibernate.LazyInitializationException: failed to lazily
PostPosted: Thu Jul 26, 2007 8:04 am 
Newbie

Joined: Wed Jun 06, 2007 8:09 am
Posts: 14
Location: Germany
Hallo,

ich arbeite an meiner Masterarbeit. Es handelt sich um eine Webanwendung mit folgenden Komponenten. Hibernate 3.2, JSF 1.1, Tomcat 5.5.

Ich möchte eine Diagnostik einer Realisierung zuweisen und erhalte folgende Fehlermeldung:

Quote:
HTTP Status 500 -

--------------------------------------------------------------------------------

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Exception while invoking expression #{realisierungController.selectDiagnostik}
javax.faces.webapp.FacesServlet.service(FacesServlet.java:154)
prozessManager.web.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:24)


root cause

javax.faces.el.EvaluationException: Exception while invoking expression #{realisierungController.selectDiagnostik}
org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:156)
javax.faces.component.UICommand.broadcast(UICommand.java:89)
javax.faces.component.UIData.broadcast(UIData.java:517)
javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171)
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
prozessManager.web.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:24)


root cause

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: prozessManager.domain.Realisierung.diagnostikList, no session or session was closed
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:183)
org.hibernate.collection.PersistentBag.add(PersistentBag.java:274)
prozessManager.domain.Realisierung.addDiagnostik(Realisierung.java:72)
prozessManager.controller.RealisierungController.selectDiagnostik(RealisierungController.java:61)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132)
javax.faces.component.UICommand.broadcast(UICommand.java:89)
javax.faces.component.UIData.broadcast(UIData.java:517)
javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171)
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
prozessManager.web.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:24)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.23 logs.


--------------------------------------------------------------------------------

Apache Tomcat/5.5.23


hier die jsp:

Code:
...
<h:dataTable id="diagnodtikSelection" value="#{diagnostikListController.diagnostikSelections}" var="diagnostikSelection">
            <f:param id="id" value="#{diagnostikSelection.diagnostik.id}"/>
            <h:column>
               <h:outputText value="#{diagnostikSelection.diagnostik.name}"/>
            </h:column>
            <h:column>
               <h:commandLink
                  actionListener="#{diagnostikListController.bearbeitenDiagnostik}"
                  action="bearbeitenDiagnostik"
                  >
                  <h:outputText value="bearbeiten"/>
                  <f:param id="bearbeiten" value="#{diagnostikSelection.diagnostik.id}" name="id"/>
               </h:commandLink>
            </h:column>
            <h:column>
               <h:commandLink
                  actionListener="#{realisierungController.selectDiagnostik}"
                  action="selectDiagnostik"
                  >
                  <h:outputText value="zuweisen"/>
                  <f:param id="realisierungZuweisen" value="#{diagnostikSelection.diagnostik.id}" name="id"/>
               </h:commandLink>
            </h:column>
            <h:column>
               <h:selectBooleanCheckbox id="selektion" value="#{diagnostikSelection.selected}"/>
            </h:column>
         </h:dataTable>
...


von actionListener="#{realisierungController.selectDiagnostik}" geht's dann zu:

Code:
package prozessManager.controller;

import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;

import org.hibernate.Session;

import prozessManager.domain.Diagnostik;
import prozessManager.domain.Realisierung;
import prozessManager.services.HibernateUtil;

public class RealisierungController {

   private Realisierung realisierung = new Realisierung();

   public Realisierung getRealisierung() {
      return realisierung;
   }

   public void setRealisierung(Realisierung realisierung) {
      this.realisierung = realisierung;
   }
   
   public String saveRealisierung() {
      
      Session session = HibernateUtil.getSessionFactory().getCurrentSession();
      session.save(realisierung);
      return "realisierungList";
   }

   public String deleteRealisierung(){
      Session session = HibernateUtil.getSessionFactory().getCurrentSession();
      session.delete(realisierung);
      return "realisierungList";
   }
   public String createRealisierung(){
      realisierung=null;
      realisierung = new Realisierung();
      return "anlegenRealisierung";
   }
   public String updateRealisierung() {
      
      Session session = HibernateUtil.getSessionFactory().getCurrentSession();
      session.update(realisierung);
      return "realisierungList";
   }
   public void selectPerson(ActionEvent actionEvent) {
      Long id = (Long) ((UIParameter)actionEvent.getComponent().findComponent("realisierungZuweisen")).getValue();
      PersonListController personListController = new PersonListController();
      realisierung.setPerson(personListController.getPerson(id));
      updateRealisierung();
   }
   public String selectDiagnostik(ActionEvent actionEvent) {
      Long id = (Long) ((UIParameter)actionEvent.getComponent().findComponent("realisierungZuweisen")).getValue();
      System.out.println(id);
      DiagnostikListController diagnostikListController = new DiagnostikListController();
      Diagnostik aDiagnostik = new Diagnostik();
      aDiagnostik= diagnostikListController.getDiagnostik(id);
      System.out.println(aDiagnostik.getName());
      System.out.println(this.realisierung.getHauptdiagnose());
      realisierung.addDiagnostik(aDiagnostik);
      updateRealisierung();
      return "realisierungList";
   }
}


public String selectDiagnostik(ActionEvent actionEvent) läuft glatt durch bis zur Zeile "realisierung.addDiagnostik(aDiagnostik);"
Dann kommt die oben aufgeführte Fehlermeldung, die ich nicht verstehe. Eine Session müsste doch offen sein.

Code:
package prozessManager.domain;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="Realisierung")
public class Realisierung {
   private String nebendiagnose;
   private String hauptdiagnose;
   private Person person;
   private List<Diagnostik> diagnostikList = new LinkedList<Diagnostik>();
   private Long id;
   
   
   public Realisierung(String nebendiagnose, String hauptdiagnose, Person person) {
      this.nebendiagnose = nebendiagnose;
      this.hauptdiagnose = hauptdiagnose;
      this.person=person;
   }
   public Realisierung() {
   }
   public String getHauptdiagnose() {
      return hauptdiagnose;
   }
   public void setHauptdiagnose(String hauptdiagnose) {
      this.hauptdiagnose = hauptdiagnose;
   }
   
   @Id @GeneratedValue(strategy=GenerationType.AUTO)
   public Long getId() {
      return id;
   }
   public void setId(long id) {
      this.id = id;
   }
   public String getNebendiagnose() {
      return nebendiagnose;
   }
   public void setNebendiagnose(String nebendiagnose) {
      this.nebendiagnose = nebendiagnose;
   }
   @OneToOne
   @JoinColumn(name="Person_FK")
   public Person getPerson() {
      return person;
   }
   public void setPerson(Person person) {
      this.person = person;
   }
   
   @ManyToMany(mappedBy="realisierungen")
   public List<Diagnostik> getDiagnostikList() {
      return diagnostikList;
   }
   public void setDiagnostikList(List<Diagnostik> diagnostikList) {
      this.diagnostikList = diagnostikList;
   }
   public void addDiagnostik(Diagnostik diagnostik){
      diagnostikList.add(diagnostik);
   }
}




Hier noch meine Service Klassen:
Code:
package prozessManager.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.Transaction;

import prozessManager.services.HibernateUtil;

public class HibernateSessionRequestFilter implements Filter {

   public void destroy() {
   }

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
      try {
         chain.doFilter(request, response);
         transaction.commit();
      }
      catch(Throwable throwable) {
         transaction.rollback();
         if (throwable instanceof ServletException) {
            throw (ServletException) throwable;
         }
         ServletException servletException = new ServletException();
         servletException.initCause(throwable);
         throw servletException;
      }
      
   }

   public void init(FilterConfig arg0) throws ServletException {
   }

}


Code:
package prozessManager.services;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import prozessManager.domain.Diagnostik;
import prozessManager.domain.Patient;
import prozessManager.domain.Person;
import prozessManager.domain.Realisierung;
import prozessManager.domain.Test;



public class HibernateUtil {

   private static boolean recreateDB = false;
   
   public static void setRecreateDB(boolean recreateDB) {
      HibernateUtil.recreateDB = recreateDB;
   }
   
   public static SessionFactory getSessionFactory() {
      if (sessionFactory == null) {
         sessionFactory = sessionFactory("hibernate.cfg.xml");
      }
      return sessionFactory;
   }
   
   private static SessionFactory sessionFactory = null;
   
   private static SessionFactory sessionFactory(String configurationFileName) {
      try {
         AnnotationConfiguration annotationConfiguration =
            new AnnotationConfiguration()
            .addAnnotatedClass(Person.class)
            .addAnnotatedClass(Test.class)
            .addAnnotatedClass(Realisierung.class)
            .addAnnotatedClass(Diagnostik.class)
            .addAnnotatedClass(Patient.class);
         
         if (recreateDB) annotationConfiguration.setProperty("hibernate.hbm2ddl.auto", "create");
         annotationConfiguration.configure();
         return annotationConfiguration.buildSessionFactory();
      } catch (Throwable ex){
         System.err.println("Initial SessionFactory creation failed." + ex);
         throw new ExceptionInInitializerError(ex);
      }
   }
   
}


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 26, 2007 9:08 am 
Expert
Expert

Joined: Tue Dec 07, 2004 6:57 am
Posts: 285
Location: Nürnberg, Germany
Du hast mit Sicherheit deine Session vor Eintritt in die View (JSF) geschlossen. Dann kann Hibernate keine Collections (die per Default lazy sind, was auch gut ist) mehr nachladen.

Schau dir mal das Open Session In View Pattern an:
http://www.hibernate.org/43.html

_________________
Please don't forget to rate


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 27, 2007 3:15 am 
Newbie

Joined: Mon Jul 02, 2007 2:12 pm
Posts: 18
Hi,

noch ein Tipp: OSIV könnte ein zu großes Geschütz sein. Evtl. beim Lesen die Collection gleich mitladen, z.B. mit

Hibernate.initialize(diagnostikList);

(muss in der Session erfolgen, klar).

Falls Performance wichtig ist, dann in HQL-Query per left join fetch oder bei Criteria per setFetchMode() mit JOIN mitladen.

-Thomas


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