google app engine - Appengine-datanucleus error on one to many fetch after server is restarted -
i have project have user has list of pages entities. when first create user pages fetches work expected, after restart local_db.bin appengine-datanucleus server receive error when fetching list of pages. using request factory have id of pages string - please correct me if wrong. in code below forcing fetch of page list, in reality list loaded request factory code when .with("pages") method added request. force loading of pages causes same error , allows me step code.
error java.lang.long cannot cast java.lang.integer. have stepped through lot of datanucleus code , error seems happening data store loaded newly created class. integers in class version , 1 field - both of tried making longs - clearing database, recreating data restarting server got same error. feeling has making id string.
either have set wrong or there bug datanucleus jpa 2 support. know answer this. below 2 entity classes , service method causes error.
@entity public class user { @id @generatedvalue(strategy = generationtype.sequence, generator = "userids") @sequencegenerator(name = "userids") private long id; @version private integer version; private string name = ""; private string lowername = ""; private date lastlogindate; private date createdate; private boolean isadmin; private string language = "en"; private string country = "us"; private string timezone = "est"; private string theme = "hi"; @onetomany(mappedby = "user", cascade = cascadetype.all, fetch = fetchtype.lazy) private list<page> pages ; private string startpagename = ""; public user() { createdate = new date(); pages = new arraylist<page>(); } plus getters , setters.
and page class
@entity public class page { @id @generatedvalue(strategy = identity) @extension(vendorname = "datanucleus", key = "gae.encoded-pk", value = "true") private string id; @version private integer version; @manytoone(fetch = fetchtype.lazy) private user user; private string name = ""; private string description = ""; private integer columncount = 3; @enumerated private layouttype layouttype = layouttype.col3styleeven; plus getters , setters.
and method generate error.
public user getcurrentuser() { long id = securityprovider.get().getuserid(); if (id == null) { return null; } entitymanager em = emprovider.get(); try { user user = em.find(user.class, id); list<page> pages = user.getpages(); // force loading return user; } catch (exception e) { log.throwing(service.class.getname(), "getcurrentuser", e); log.severe("could not user data: " + e.getlocalizedmessage()); return null; } }
any appreciated. thanks.
on edit: added stack trace:
java.lang.long cannot cast java.lang.integer java.lang.classcastexception: java.lang.long cannot cast java.lang.integer @ com.google.appengine.datanucleus.typeconversionutils.datastorevaluetopojovalue(typeconversionutils.java:403) @ com.google.appengine.datanucleus.fetchfieldmanager.fetchfieldfromentity(fetchfieldmanager.java:463) @ com.google.appengine.datanucleus.fetchfieldmanager.fetchobjectfield(fetchfieldmanager.java:408) @ org.datanucleus.state.abstractstatemanager.replacingobjectfield(abstractstatemanager.java:2353) @ com.ihg.dashboard.server.domain.page.jdoreplacefield(page.java) @ com.ihg.dashboard.server.domain.page.jdoreplacefields(page.java) @ org.datanucleus.state.jdostatemanager.replacefields(jdostatemanager.java:1935) @ org.datanucleus.state.jdostatemanager.replacefields(jdostatemanager.java:1962) @ com.google.appengine.datanucleus.entityutils$1.fetchfields(entityutils.java:974) @ org.datanucleus.state.jdostatemanager.loadfieldvalues(jdostatemanager.java:764) @ org.datanucleus.state.jdostatemanager.initialiseforhollow(jdostatemanager.java:205) @ org.datanucleus.state.statemanagerfactory.newforhollowpopulated(statemanagerfactory.java:89) @ org.datanucleus.state.objectproviderfactory.newforhollowpopulated(objectproviderfactory.java:75) @ org.datanucleus.objectmanagerimpl.findobject(objectmanagerimpl.java:2882) @ com.google.appengine.datanucleus.entityutils.entitytopojo(entityutils.java:1014) @ com.google.appengine.datanucleus.fetchfieldmanager.getcollectionfromdatastoreobject(fetchfieldmanager.java:680) @ com.google.appengine.datanucleus.fetchfieldmanager.fetchrelationfield(fetchfieldmanager.java:483) @ com.google.appengine.datanucleus.fetchfieldmanager.fetchobjectfield(fetchfieldmanager.java:405) @ org.datanucleus.state.abstractstatemanager.replacingobjectfield(abstractstatemanager.java:2353) @ com.ihg.dashboard.server.domain.ihguser.jdoreplacefield(ihguser.java) @ com.ihg.dashboard.server.domain.ihguser.jdoreplacefields(ihguser.java) @ org.datanucleus.state.jdostatemanager.replacefields(jdostatemanager.java:1935) @ org.datanucleus.state.jdostatemanager.replacefields(jdostatemanager.java:1962) @ com.google.appengine.datanucleus.datastorepersistencehandler.fetchobject(datastorepersistencehandler.java:567) @ org.datanucleus.state.jdostatemanager.loadfieldsfromdatastore(jdostatemanager.java:1638) @ org.datanucleus.state.jdostatemanager.loadspecifiedfields(jdostatemanager.java:1240) @ org.datanucleus.state.jdostatemanager.isloaded(jdostatemanager.java:1728) @ com.ihg.dashboard.server.domain.ihguser.jdogetpages(ihguser.java) @ com.ihg.dashboard.server.domain.ihguser.getpages(ihguser.java:209) @ com.ihg.dashboard.server.services.hpluiservice.getcurrentihguser(hpluiservice.java:188) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) @ java.lang.reflect.method.invoke(method.java:597) @ com.google.appengine.tools.development.agent.runtime.runtime.invoke(runtime.java:115) @ com.google.web.bindery.requestfactory.server.reflectiveservicelayer.invoke(reflectiveservicelayer.java:182) @ com.google.web.bindery.requestfactory.server.servicelayerdecorator.invoke(servicelayerdecorator.java:111) @ com.google.web.bindery.requestfactory.server.servicelayerdecorator.invoke(servicelayerdecorator.java:111) @ com.google.web.bindery.requestfactory.server.servicelayerdecorator.invoke(servicelayerdecorator.java:111) @ com.google.web.bindery.requestfactory.server.simplerequestprocessor.processinvocationmessages(simplerequestprocessor.java:463) @ com.google.web.bindery.requestfactory.server.simplerequestprocessor.process(simplerequestprocessor.java:233) @ com.google.web.bindery.requestfactory.server.simplerequestprocessor.process(simplerequestprocessor.java:135) @ com.google.web.bindery.requestfactory.server.requestfactoryservlet.dopost(requestfactoryservlet.java:133) @ com.ihg.dashboard.server.dashboardservlet.dopost(dashboardservlet.java:61) @ javax.servlet.http.httpservlet.service(httpservlet.java:637) @ javax.servlet.http.httpservlet.service(httpservlet.java:717) @ com.google.inject.servlet.servletdefinition.doservice(servletdefinition.java:263) @ com.google.inject.servlet.servletdefinition.service(servletdefinition.java:178) @ com.google.inject.servlet.managedservletpipeline.service(managedservletpipeline.java:91) @ com.google.inject.servlet.filterchaininvocation.dofilter(filterchaininvocation.java:62) @ com.google.inject.servlet.managedfilterpipeline.dispatch(managedfilterpipeline.java:118) @ com.google.inject.servlet.guicefilter.dofilter(guicefilter.java:113) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.appengine.api.socket.dev.devsocketfilter.dofilter(devsocketfilter.java:74) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.appengine.tools.development.responserewriterfilter.dofilter(responserewriterfilter.java:123) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.appengine.tools.development.headerverificationfilter.dofilter(headerverificationfilter.java:34) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.appengine.api.blobstore.dev.serveblobfilter.dofilter(serveblobfilter.java:61) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.apphosting.utils.servlet.transactioncleanupfilter.dofilter(transactioncleanupfilter.java:43) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.appengine.tools.development.staticfilefilter.dofilter(staticfilefilter.java:125) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ com.google.appengine.tools.development.backendserversfilter.dofilter(backendserversfilter.java:97) @ org.mortbay.jetty.servlet.servlethandler$cachedchain.dofilter(servlethandler.java:1157) @ org.mortbay.jetty.servlet.servlethandler.handle(servlethandler.java:388) @ org.mortbay.jetty.security.securityhandler.handle(securityhandler.java:216) @ org.mortbay.jetty.servlet.sessionhandler.handle(sessionhandler.java:182) @ org.mortbay.jetty.handler.contexthandler.handle(contexthandler.java:765) @ org.mortbay.jetty.webapp.webappcontext.handle(webappcontext.java:418) @ com.google.appengine.tools.development.devappenginewebappcontext.handle(devappenginewebappcontext.java:94) @ org.mortbay.jetty.handler.handlerwrapper.handle(handlerwrapper.java:152) @ com.google.appengine.tools.development.jettycontainerservice$apiproxyhandler.handle(jettycontainerservice.java:409) @ org.mortbay.jetty.handler.handlerwrapper.handle(handlerwrapper.java:152) @ org.mortbay.jetty.server.handle(server.java:326) @ org.mortbay.jetty.httpconnection.handlerequest(httpconnection.java:542) @ org.mortbay.jetty.httpconnection$requesthandler.content(httpconnection.java:938) @ org.mortbay.jetty.httpparser.parsenext(httpparser.java:755) @ org.mortbay.jetty.httpparser.parseavailable(httpparser.java:218) @ org.mortbay.jetty.httpconnection.handle(httpconnection.java:404) @ org.mortbay.io.nio.selectchannelendpoint.run(selectchannelendpoint.java:409) @ org.mortbay.thread.queuedthreadpool$poolthread.run(queuedthreadpool.java:582)
on edit 2: after setting breakpoint exception thrown see enumerated field causing problem. doing there not right.
the code @ line exception occurs is:
value = enumclass.getenumconstants()[(integer)value];
so seems value when read db long, i'm guess when kept in cache newly created entity integer.
on edit 3
i change enumerated field to
@enumerated(string) private layouttype layouttype = layouttype.col3styleeven;
this stores value string instead of ordinal. isn't efficient ordinal me past error.
Comments
Post a Comment