Hello,
I'm curruntly building a webapp built on the model of the petclinic sample app.
I am facing an error of initialization of a collection when executing a SimpleFormController. Hibernate says it doesn't find the session. I use HibernateTemplate to manage data access.
Here is the error :
Here is the XML declaration of the addClassForm bean :Code:net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection - no session or session was closed at net.sf.hibernate.collection.PersistentCollection.initialize(PersistentCollection.java:209) at net.sf.hibernate.collection.PersistentCollection.read(PersistentCollection.java:71) at net.sf.hibernate.collection.Set.toString(Set.java:217) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuffer.append(Unknown Source) at com.spm.bulletin.Entity.toString(Entity.java:66) at java.lang.String.valueOf(Unknown Source) at java.util.AbstractCollection.toString(Unknown Source) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuffer.append(Unknown Source) at com.spm.bulletin.web.AddPupilsClassForm.onSubmit(AddPupilsClassForm.java:44) at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:248) at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:243) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:128) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:675) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:623) at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:384) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:353) at javax.servlet.http.HttpServlet.service(HttpServlet.java:716) at javax.servlet.http.HttpServlet.service(HttpServlet.java:809) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200) at
The Java class extending SimpleFormController :Code:<bean id="addClassForm" class="com.spm.bulletin.web.AddPupilsClassForm"> <property name="formView"><value>classForm</value></property> <property name="successView"><value>classRedirect</value></property> <property name="validator"><ref local="classValidator"/></property> <property name="school"><ref bean="school"/></property> </bean>
The error is thrown when calling the getSchool().getTeachers() method in the onSubmit(...).Code:public class AddPupilsClassForm extends AbstractSchoolForm { public AddPupilsClassForm() { // OK to start with a blank command object setCommandClass(PupilsClass.class); // activate session form mode to allow for detection of duplicate submissions setSessionForm(true); } protected Map referenceData(HttpServletRequest request) throws ServletException { Map refData = new HashMap(); refData.put("teachers", getSchool().getTeachers()); return refData; } /** Method inserts a new <code>PupilsClass</code>. */ protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException arg3) throws ServletException { PupilsClass pupilsClass = (PupilsClass) command; int mainTeacherId = Integer.parseInt(request.getParameter("mainTeacherId")); System.out.println("mainTeacherId : "+mainTeacherId); if (mainTeacherId != -1) { System.out.println("teachers : " + getSchool().getTeachers()); Teacher teacher = (Teacher)Entity.getById(getSchool().getTeachers(), Teacher.class, mainTeacherId); //System.out.println("pupilsClass : "+pupilsClass); pupilsClass.setMainTeacher(teacher); } System.out.println("pupilsClass : " + pupilsClass); //pupilsClass.setMainTeacher(getSchool().loadTeacher(pupilsClass.getMainTeacher().getId())); // delegate the insert to the Business layer getSchool().storePupilsClass(pupilsClass); return new ModelAndView(getSuccessView(), "pupilsClassId", Integer.toString(pupilsClass.getId())); } protected ModelAndView handleInvalidSubmit(HttpServletRequest request, HttpServletResponse response) throws Exception { return disallowDuplicateFormSubmission(request, response); } }
And the class managing data access :
Code:public class HibernateSchool extends HibernateDaoSupport implements School { public Collection getTeachers() throws DataAccessException { return getHibernateTemplate().find("from Teacher teacher order by teacher.lastName, teacher.firstName"); } [...]


Reply With Quote