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:
hier die jsp:
von actionListener="#{realisierungController.selectDiagnostik}" geht's dann zu:
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:
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);
}
}
}