Spring, Hibernate - many-to-many - LazyInitializationException -


i have 2 models.

user:

    @entity public class user implements serializable {     long id;     string name;     list<car> cars;     public user() {      }     public long getid() {         return id;     }     public void setid(long id) {         this.id = id;     }     public string getname() {         return name;     }     public void setname(string name) {         this.name = name;     }     public list<car> getcars() {         return cars;     }     public void setcars(list<car> cars) {         this.cars = cars;     } } 

car:

@entity public class car implements serializable { long id; string mark; public car() {  } public long getid() {     return id; } public void setid(long id) {     this.id = id; } public string getmark() {     return mark; } public void setmark(string mark) {     this.mark = mark; } } 

mapping fies:

user:

    <hibernate-mapping> <class name="com.bontade.phone_book.mvc.spring.models.user" table="users">     <id name="id" type="java.lang.long">     <column name="id" />     <generator class="identity" />     </id>             <property name="name" not-null="true" length="100" type="java.lang.string">     <column name="name" />     </property>            <list name="cars" table="user_car" cascade="all">     <key>         <column name="user_id" />     </key>     <list-index></list-index>     <many-to-many column="car_id" class="com.bontade.phone_book.mvc.spring.models.car" />     </list>         </class> </hibernate-mapping> 

car:

    <hibernate-mapping> <class name="com.bontade.phone_book.mvc.spring.models.car" table="cars">     <id name="id" type="java.lang.long">     <column name="id" />     <generator class="identity" />     </id>     <property name="mark"  not-null="true" length="20" type="java.lang.string">     <column name="mark" />     </property>      </class> </hibernate-mapping> 

homepagecontroller:

public class homepagecontroller extends abstractcontroller { private userdao userdao; private cardao cardao;  @override protected modelandview handlerequestinternal(httpservletrequest request,         httpservletresponse response) throws exception {             car markcar = new car();     markcar.setid(null);     markcar.setmark("111");     cardao.savecar(markcar);      user mark = new user();     mark.setid(null);     mark.setname("mark");     list = new arraylist<car>();     a.add(markcar);     mark.setcars(a);     userdao.saveuser(mark);     list<user> users = userdao.getall();     system.out.println("==" + users.size() + "===");     system.out.println(users.get(0).getcars().get(0).getmark());      ... } ... } 

but when executes line :

system.out.println(users.get(0).getcars().get(0).getmark()); 

i'm getting error following stack trace:

        hibernate: select user0_.id id0_, user0_.name name0_ users user0_ ==1== 2011-02-23 17:35:10 org.apache.catalina.core.standardwrappervalve invoke severe: servlet.service() servlet [dispatcher] in context path [/phonebook] threw exception [request processing failed; nested exception org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: com.bontade.phone_book.mvc.spring.models.user.cars, no session or session closed] root cause org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: com.bontade.phone_book.mvc.spring.models.user.cars, no session or session closed     @ org.hibernate.collection.abstractpersistentcollection.throwlazyinitializationexception(abstractpersistentcollection.java:380)     @ org.hibernate.collection.abstractpersistentcollection.throwlazyinitializationexceptionifnotconnected(abstractpersistentcollection.java:372)     @ org.hibernate.collection.abstractpersistentcollection.readelementbyindex(abstractpersistentcollection.java:173)     @ org.hibernate.collection.persistentlist.get(persistentlist.java:293)     @ com.bontade.phone_book.mvc.spring.controllers.homepagecontroller.handlerequestinternal(homepagecontroller.java:59)     @ org.springframework.web.servlet.mvc.abstractcontroller.handlerequest(abstractcontroller.java:153)     @ org.springframework.web.servlet.mvc.simplecontrollerhandleradapter.handle(simplecontrollerhandleradapter.java:48)     @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:875)     @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:807)     @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:571)     @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:501)     @ javax.servlet.http.httpservlet.service(httpservlet.java:621)     @ javax.servlet.http.httpservlet.service(httpservlet.java:722)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:306)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:96)     @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:76)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:244)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:240)     @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:161)     @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:164)     @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:108)     @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:558)     @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)     @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:379)     @ org.apache.coyote.http11.http11processor.process(http11processor.java:243)     @ org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:259)     @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:281)     @ java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886)     @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908)     @ java.lang.thread.run(thread.java:662) 

have wrong constructed mapping files, many-to-many relation?

by default hibernate lazy load collections. in other words, won't go database retrieve list of cars until absolutely needs to. means returned object dao layer won't have cars list initialized until try access it. when try access it, you're no longer within session, , exception.

you can explicitly disable lazy fetching on list property setting lazy="false" in hibernate mapping, make sure entire property populated before returning dao layer.


Comments

Popular posts from this blog

linux - Mailx and Gmail nss config dir -

c# - Is it possible to remove an existing registration from Autofac container builder? -

php - Mysql PK and FK char(36) vs int(10) -