org.hibernate.LazyInitializationException: failed to lazily

Status
Nicht offen für weitere Antworten.

FT77

Mitglied
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:

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. 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);
		}
	}
	
}
 

FT77

Mitglied
... hier noch die Entity Klasse Realisierung mit angesprochnen Methode addDiagnostik:

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);
	}
}
 
S

SlaterB

Gast
was hälst du von dem allgemeinen Hinweis, dass DB-Operationen in ein Servlet gehören und nicht in die JSP? ;)

--------

unabhängig davon:
hast du jemals erfolgreich DB-Operationen in JSPs durchgeführt?
klappt es also nur bei diesen Code nicht oder generell?

wann wird denn so eine Session zerstört/ geschlossen?
gibt es dafür eine Codestelle?
dann könntest du dort
System.out.println("session zu");
schreiben
und in deine JSP an der fraglichen Stelle
System.out.println("zugriff auf session");
schreiben und vergleichen

-------

generell gibts noch das Problem, Hibernate-Objekte in der Http-Session zu speichern und bei späteren Request dann Dinge nachzuladen,
die Session vom ersten Request ist da aber hoffentlich schon sehr lange zu,
einfache Lösung wie bei JSPs: einfach solche Objekte nicht rauslassen aus der sicheren Servlet-Umgebung
 
G

Guest

Gast
Entschuldige, aber ich verstehe dich leider nicht:

was hälst du von dem allgemeinen Hinweis, dass DB-Operationen in ein Servlet gehören und nicht in die JSP? icon_wink.gif

Habe ich denn DB-Operationen in meiner JSP? Ich denke nicht. Die liegen doch in den Controller Klassen.

hast du jemals erfolgreich DB-Operationen in JSPs durchgeführt?
klappt es also nur bei diesen Code nicht oder generell?

siehe Oben. Ansonsten kann ich sagen, dass ich verschiedene Entitäten in der DB anlegen kann. Es lassen sich auch Entitäten einander zuweisen und diese Verindungen abspeichern.

Felix
 
S

SlaterB

Gast
in deiner JSP steht
#{realisierungController.selectDiagnostik}
was intern zu einem addDiagnostik() in dem Hibernate-Objekt führt,
was wiederum zu einem DB-Zugriff führt

du sagst es doch selber: 'Ich möchte eine Diagnostik einer Realisierung zuweisen'

wie passt
'Ich möchte eine Diagnostik einer Realisierung zuweisen'
zu
'Habe ich denn DB-Operationen in meiner JSP?'
?
 

KSG9|sebastian

Top Contributor
Eben!
Problem ist dass Hibernate nur das "oberste" Element von deinem Modelgeflecht zieht.
Dannach wird dann die Session geschlossen.
Irgendwann kommt dann ein Code wo sowas sagt wie
rootClass.getDataCollection(). Dann versucht Hibernate eben mit der Session von rootClass die Collection zu laden und stellt fest dass die Session geschlossen ist.
Andere Möglichkeit ist das Objekt wieder der Session bekanntzumachen (glaub merge oder sowas).
Aber schau dir mal die SessionInViewFilter an.

Gruß Sebastian
 

kleiner_held

Top Contributor
Probier mal
Code:
	@ManyToMany(mappedBy="realisierungen", fetch=FetchType.EAGER)
	public List<Diagnostik> getDiagnostikList() {
		return diagnostikList;
	}
 

KSG9|sebastian

Top Contributor
@kleiner held: Es macht aber keinen Sinn auf LazyInitialization zu verzichten. Bei nem größeren Objektgeflecht wirst doch wahnsinnig bis alles aus der Datenbank gezogen wurde.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Java EE 6, eclipse, maven, jsf, hibernate, mysql Allgemeines EE 8
O Hibernate Fehlermeldung bei start des Servers Allgemeines EE 2
E Frage zu Wildfly und Hibernate OGM Allgemeines EE 0
S Frage zu Jersey + Hibernate Allgemeines EE 1
D GWT mit Hibernate und Sql Datenbank Allgemeines EE 2
B Wicket, Hibernate, H2 memDB Anfänger Frage Allgemeines EE 2
H Hibernate - OneToMany - mappedBy reference an unknown target entity property Allgemeines EE 1
A Hibernate endlich zu Laufen bekommen... Allgemeines EE 11
A Erste Schritte... Problem mit Hibernate Allgemeines EE 15
LadyMilka Ablaufdiagramm mit/ohne Hibernate Allgemeines EE 2
P Mit JAXB erzeugte Klassen persistieren (Hibernate) Allgemeines EE 10
K Anfänger: Hibernate + Web Allgemeines EE 2
T Hibernate 3 + EJB 3 + JBoss 5 Allgemeines EE 6
G Persistenz mit Hibernate oder J2EE? Allgemeines EE 11
C Hibernate - Expression.or Allgemeines EE 4
D Erst Spring oder erst Hibernate lernen? Allgemeines EE 2
D Java EE vs. Spring/Hibernate Allgemeines EE 26
Y myFaces und Hibernate Session Handling Allgemeines EE 7
W Speicher-Problem bei WebApp unter Tomcat, Struts, Hibernate Allgemeines EE 3
byte Remote Lazy Loading mit Spring und Hibernate Allgemeines EE 5
G JSF, Hibernate, Spring --> Struktur Allgemeines EE 2
F [Hallo] Frage zu Hibernate Mapping und Vererbung Allgemeines EE 3
G JSF | Hibernate | MySQL Allgemeines EE 17
G Hibernate: org.hibernate.TransactionException Allgemeines EE 4
J nur bestimmte Mapping-Dateien berücksichtigen (Hibernate) Allgemeines EE 14
S Hibernate EJB3 Allgemeines EE 2
E JBoss Hibernate Datenbank-Timeout Allgemeines EE 3
S Hibernate, Tomcat und Eclipse treiben mich zum Wahnsinn. Allgemeines EE 2
2 hibernate - createQuery() Allgemeines EE 9
T Hibernate die richtige Wahl? Allgemeines EE 2
M JSF mit Hibernate Allgemeines EE 14
W Hibernate *.Jar's im Klassenpfad Allgemeines EE 10
M Tomcat, Hibernate, MySQL und die EOFException Allgemeines EE 7
C EntityManager wirft NullpointerException: JBoss-Hibernate Allgemeines EE 4
E JSF, Hibernate & MySQL: Keine Datenbankaktualisierung Allgemeines EE 5
M mit Hibernate 1:n in view richtige implementieren Allgemeines EE 3
M Hibernate Criteria frage Allgemeines EE 2
A Speicherproblem bei Webanwendung mit Hibernate und Stuts Allgemeines EE 6
A Hibernate-Problem mit MySQL-Cluster Allgemeines EE 6
S Fragen zu: Servlets, Struts & Hibernate Allgemeines EE 9
E JOINS und Hibernate? Allgemeines EE 3
S Hibernate Mapping Problem Allgemeines EE 3
S Hibernate INSERT Problem Allgemeines EE 11
S Java Enum in MySQL und Hibernate Allgemeines EE 3
R Hibernate: many-to-many funktioniert noch nicht ganz Allgemeines EE 2
D Hibernate hql suche Date Allgemeines EE 9
B JSF + Hibernate How2 Allgemeines EE 2
G [JSF+Hibernate]: DB-Constraints in Validierungsphase? Allgemeines EE 4
P struts Hibernate MySQL Select Statement Allgemeines EE 24
G JTA ja/nein & wie (JBoss & Hibernate & Transakti Allgemeines EE 3
T Hibernate & Logging in Log4J Allgemeines EE 4
T JSTL + Struts (inkl.Hibernate) -> forEach Problem Allgemeines EE 6
G Persistenz-Entscheidung (Entity Beans, Hibernate, JDBC) Allgemeines EE 12
S Hibernate 2.x mit Eclipse 2.1 Allgemeines EE 16
T LazyInitializationException - Warum? Allgemeines EE 7
byte LazyInitializationException vs DTOs Allgemeines EE 15
S FAIL - Deployed application at context path /Address but context failed to start Allgemeines EE 1
J JSF Glassfish jdbcRelam und Oracle-Datenbank - WEB9102: Web Login Failed Allgemeines EE 0
E Eclipse Helios JNDI Lookup failed Allgemeines EE 5
P J2EE Struts - Database connection failed - Hilfe?:( Allgemeines EE 6

Ähnliche Java Themen

Neue Themen


Oben