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