Tuesday, 15 September 2015

java - Initialize all lazy loaded collections in hibernate -



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