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
Post a Comment