java - Issue with LazyInitializationException could not initialize proxy - no Session -


i'm having famous problem lazyinitializationexception in hibernate. i've seen lot of question still couldn't solve problem.

i have many many relation this:

teen.java

public class teen implements serializable {      @manytomany(cascade = cascadetype.all, fetch = fetchtype.lazy)     @jointable(name = "teen_follower",             joincolumns = @joincolumn(name = "teenemail"),             inversejoincolumns = @joincolumn(name = "followeremail"))     private list<follower> followerlist; } 

follower.java

public class follower implements serializable {      @manytomany(cascade = cascadetype.all, fetch = fetchtype.lazy)     @jointable(name = "teen_follower",             joincolumns = @joincolumn(name = "followeremail"),             inversejoincolumns = @joincolumn(name = "teenemail"))     private list<teen> teenlist; } 

one teen has n followers , 1 follower can follow n teens.

i have entries in database , i'm fetching teens it.

list<teen> teens = (list<teen>) teendao.findall();  (teen item : teens) {     system.out.println("teen " + item.getemail());     list<follower> followers = item.getfollowerlist();     (follower follower : followers) {         system.out.println("follower " + follower.getemail());     } } 

i'm getting exception on above code when try read followers list got getfollowerlist() method.

org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: com.capstone.server.model.teen.followerlist, not initialize proxy - no session     org.hibernate.collection.internal.abstractpersistentcollection.throwlazyinitializationexception(abstractpersistentcollection.java:572)     org.hibernate.collection.internal.abstractpersistentcollection.withtemporarysessionifneeded(abstractpersistentcollection.java:212)     org.hibernate.collection.internal.abstractpersistentcollection.initialize(abstractpersistentcollection.java:551)     org.hibernate.collection.internal.abstractpersistentcollection.read(abstractpersistentcollection.java:140)     org.hibernate.collection.internal.persistentbag.iterator(persistentbag.java:294)     com.capstone.server.controller.teencontroller.visualizar(teencontroller.java:38)     sun.reflect.nativemethodaccessorimpl.invoke0(native method)     sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57)     sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     java.lang.reflect.method.invoke(method.java:606)     org.springframework.web.method.support.invocablehandlermethod.invoke(invocablehandlermethod.java:214)     org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:132)     org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:104)     org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:748)     org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:689)     org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:83)     org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:945)     org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:876)     org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:931)     org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:822)     javax.servlet.http.httpservlet.service(httpservlet.java:622)     org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:807)     javax.servlet.http.httpservlet.service(httpservlet.java:729)     org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) 

really don't know anymore. tried add @transaction annotation in method causes error , worked. when send teen object android application, same exception while converting object json.

my configuration files are:

servlet-context.xml

<?xml version="1.0" encoding="utf-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc"     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:beans="http://www.springframework.org/schema/beans"     xmlns:context="http://www.springframework.org/schema/context"     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"     xsi:schemalocation="             http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans.xsd             http://www.springframework.org/schema/context             http://www.springframework.org/schema/context/spring-context.xsd             http://www.springframework.org/schema/mvc             http://www.springframework.org/schema/mvc/spring-mvc.xsd             http://www.springframework.org/schema/tx             http://www.springframework.org/schema/tx/spring-tx.xsd">      <!-- dispatcherservlet context: defines servlet's request-processing          infrastructure -->      <!-- enables spring mvc @controller programming model -->     <annotation-driven />      <!-- handles http requests /resources/** efficiently serving          static resources in ${webapproot}/resources directory -->     <resources mapping="/resources/**" location="/resources/" />      <!-- resolves views selected rendering @controllers .jsp resources          in /web-inf/views directory -->     <beans:bean         class="org.springframework.web.servlet.view.internalresourceviewresolver">         <beans:property name="prefix" value="/web-inf/views/" />         <beans:property name="suffix" value=".jsp" />     </beans:bean>      <beans:bean id="messagesource"         class="org.springframework.context.support.reloadableresourcebundlemessagesource">         <beans:property name="basename" value="classpath:messages" />         <beans:property name="defaultencoding" value="utf-8" />     </beans:bean>      <beans:bean id="localeresolver"         class="org.springframework.web.servlet.i18n.cookielocaleresolver">         <beans:property name="defaultlocale" value="en" />         <beans:property name="cookiename" value="myapplocalecookie"></beans:property>         <beans:property name="cookiemaxage" value="3600"></beans:property>     </beans:bean>      <interceptors>         <beans:bean             class="org.springframework.web.servlet.i18n.localechangeinterceptor">             <beans:property name="paramname" value="locale" />         </beans:bean>     </interceptors>      <!-- configure plugin json request , response in method handler -->     <beans:bean         class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter">         <beans:property name="messageconverters">             <beans:list>                 <beans:ref bean="jsonmessageconverter" />             </beans:list>         </beans:property>     </beans:bean>      <!-- configure bean convert json pojo , vice versa -->     <beans:bean id="jsonmessageconverter"         class="org.springframework.http.converter.json.mappingjackson2httpmessageconverter">     </beans:bean>      <!-- enable @transactional annotation -->     <tx:annotation-driven />      <mvc:interceptors>         <beans:bean class="com.capstone.server.interceptor.logininterceptor" />     </mvc:interceptors>      <beans:bean id="multipartresolver"         class="org.springframework.web.multipart.commons.commonsmultipartresolver">          <!-- setting maximum upload size -->         <beans:property name="maxuploadsize" value="1000000" />     </beans:bean>      <context:component-scan base-package="com.capstone.server" />  </beans:beans> 

persistencejpaconfig.java

@configuration @enabletransactionmanagement @propertysource("classpath:application.properties") public class persistencejpaconfig {      @resource     private environment env;      @bean     public localcontainerentitymanagerfactorybean entitymanagerfactory() {         localcontainerentitymanagerfactorybean em = new localcontainerentitymanagerfactorybean();         em.setdatasource(datasource());         em.setpackagestoscan(new string[] {                 constants.package_name         });          jpavendoradapter vendoradapter = new hibernatejpavendoradapter();         em.setjpavendoradapter(vendoradapter);         em.setjpaproperties(additionalproperties());          return em;     }      @bean     public datasource datasource() {         drivermanagerdatasource datasource = new drivermanagerdatasource();          // connection data         datasource.setdriverclassname(env.getrequiredproperty("db.driver"));         datasource.seturl(env.getrequiredproperty("db.url"));         datasource.setusername(env.getrequiredproperty("db.username"));         datasource.setpassword(env.getrequiredproperty("db.password"));         return datasource;     }      @bean     public platformtransactionmanager transactionmanager(entitymanagerfactory emf) {         jpatransactionmanager transactionmanager = new jpatransactionmanager();         transactionmanager.setentitymanagerfactory(emf);          return transactionmanager;     }      @bean     public persistenceexceptiontranslationpostprocessor exceptiontranslation() {         return new persistenceexceptiontranslationpostprocessor();     }      properties additionalproperties() {         properties properties = new properties();          // hibernate properties         properties.setproperty("hibernate.dialect", env.getrequiredproperty("hibernate.dialect"));         properties.setproperty("hibernate.show_sql", env.getrequiredproperty("hibernate.show_sql"));         properties.setproperty("hibernate.format_sql",                 env.getrequiredproperty("hibernate.format_sql"));          // updates database , generate tables, if needed         properties.setproperty("hibernate.hbm2ddl.auto",                 env.getrequiredproperty("hibernate.hbm2ddl.auto"));          // initializes database admin entry in user table         properties.setproperty("hibernate.hbm2ddl.import_files",                 env.getrequiredproperty("hibernate.hbm2ddl.import_files"));         properties.setproperty("hibernate.hbm2ddl.import_files_sql_extractor",                 env.getrequiredproperty("hibernate.hbm2ddl.import_files_sql_extractor"));          return properties;     } } 

here's way ended doing:

instead have 1 teendao.findall() method fetches lazy data, created 1 receiving boolean param forceload. implementation goes this:

@transactional public teen find(string email) {     return find(email, false); }  @transactional public teen find(string email, boolean forceload) {     teen teen = em.find(teen.class, email);     if(teen != null && forceload) {         hibernate.initialize(teen.getuser());         hibernate.initialize(teen.getfollowerlist());         hibernate.initialize(teen.getpendingfollowerlist());         hibernate.initialize(teen.getcheckinlist());     }     return teen; } 

with initialize lists desire when passing forceload true.


Comments