java - Initialize all lazy loaded collections in hibernate -
i have tried of solutions issue facing, still not clear.
i using hibernate 4.
i have parent-child relationships in entity. default, have used lazy loading collections in parent entity. however, in cases, need load whole object graph. in such cases, want forcefulness hibernate load collections. know using criteria.setfetchmode("collectionname",fetchmode.join), can load specific collection. however, if tried multiple collections, getting org.hibernate.loader.multiplebagfetchexception: cannot simultaneously fetch multiple bags.
here code:
entity
ignoring few fields , getter , setter methods
public class employee { @id @generatedvalue @column(name = "employeeid") private long id; @onetomany(fetch = fetchtype.lazy, cascade = cascadetype.all) @fetch(fetchmode.select) @joincolumn(name = "employeeid") @lazycollection(lazycollectionoption.true) private list<employeeaddress> employeeaddresses; @onetomany(fetch = fetchtype.lazy, cascade = cascadetype.all) @fetch(fetchmode.select) @joincolumn(name = "employeeid") @lazycollection(lazycollectionoption.true) private list<employeelanguage> employeelanguages; } hibernateutil
public hibernateutil{ public tentity findbyid(class<tentity> clazz, long id) { session session = sessionfactory.getcurrentsession(); criteria criteria = session.createcriteria(clazz); criteria.add(restrictions.eq("id",id)); classmetadata metadata = sessionfactory.getclassmetadata(clazz); string[] propertynamesarray = metadata.getpropertynames(); for(int i=0;i<propertynamesarray.length;i++){ criteria.setfetchmode(propertynamesarray[i], fetchmode.join); } homecoming (tentity)criteria.uniqueresult(); } } service
private void getallemployee(employee employee) { //invoke findall method of hibernateutil } i want have eager-loading of collections of employee in findall() method. please tell me how done.
adding stacktrace when using fetchtype.select within hibernateutil
org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: com.myapp.hr.entity.employee.employeeaddresses, not initialize proxy - no session org.hibernate.collection.internal.abstractpersistentcollection.throwlazyinitializationexception(abstractpersistentcollection.java:566) org.hibernate.collection.internal.abstractpersistentcollection.withtemporarysessionifneeded(abstractpersistentcollection.java:186) org.hibernate.collection.internal.abstractpersistentcollection.initialize(abstractpersistentcollection.java:545) org.hibernate.collection.internal.abstractpersistentcollection.read(abstractpersistentcollection.java:124) org.hibernate.collection.internal.persistentbag.iterator(persistentbag.java:266) java.util.collections$unmodifiablecollection$1.<init>(collections.java:1099) java.util.collections$unmodifiablecollection.iterator(collections.java:1098) com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:90) com.fasterxml.jackson.databind.ser.std.collectionserializer.serializecontents(collectionserializer.java:23) com.fasterxml.jackson.databind.ser.std.asarrayserializerbase.serialize(asarrayserializerbase.java:186) com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:569) com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:597) com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer.java:142) com.fasterxml.jackson.databind.ser.defaultserializerprovider.serializevalue(defaultserializerprovider.java:118) com.fasterxml.jackson.databind.objectmapper.writevalue(objectmapper.java:1819) org.springframework.http.converter.json.mappingjackson2httpmessageconverter.writeinternal(mappingjackson2httpmessageconverter.java:253) org.springframework.http.converter.abstracthttpmessageconverter.write(abstracthttpmessageconverter.java:207) org.springframework.web.servlet.mvc.method.annotation.abstractmessageconvertermethodprocessor.writewithmessageconverters(abstractmessageconvertermethodprocessor.java:148) org.springframework.web.servlet.mvc.method.annotation.httpentitymethodprocessor.handlereturnvalue(httpentitymethodprocessor.java:125) org.springframework.web.method.support.handlermethodreturnvaluehandlercomposite.handlereturnvalue(handlermethodreturnvaluehandlercomposite.java:71) org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:122) org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:749) org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:690) 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:961) org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:852) javax.servlet.http.httpservlet.service(httpservlet.java:618) org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:837) javax.servlet.http.httpservlet.service(httpservlet.java:725) org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) org.apache.catalina.filters.corsfilter.handlenoncors(corsfilter.java:439) org.apache.catalina.filters.corsfilter.dofilter(corsfilter.java:178)
i mentioned in comment in other reply it's different plenty , don't want lose gimby's insights editing original answer.
you can utilize reflection lookup fields @lazycollection annotation , phone call hibernate.initialize() on them. this:
public static <t> void forceloadlazycollections(class<t> tclass, t entity) { if (entity == null) { return; } (field field : tclass.getdeclaredfields()) { lazycollection annotation = field.getannotation(lazycollection.class); if (annotation != null) { seek { field.setaccessible(true); hibernate.initialize(field.get(entity)); } grab (illegalaccessexception e) { log.warning("unable forcefulness initialize field: " + field.getname()); } } } } java hibernate
No comments:
Post a Comment