I guess I need to run it in debugger with this driver version. I still suspect some NUMERIC ambiguity issue.
Andrus On Oct 5, 2012, at 5:04 PM, Emanuele Maiarelli <[email protected]> wrote: > Problem persists after upgrading to cayenne 3.1B1. > > org.apache.cayenne.CayenneRuntimeException: [v.3.1B1 May 28 2012 20:59:56] > Can't find id for {<ObjectId:Comuni, comuni_pk=4615>; committed; > [toProvince=>?; anagraficheArray=>(..); comuniCap=>55049; > comuniComIstat=>33; comuniCfPrefix=>L833; anagraficheArraySl=>(..); > comuniDesc=>PROVA]} > at > org.apache.cayenne.access.IncrementalFaultList$IncrementalListHelper.updateWithResolvedObjectInRange(IncrementalFaultList.java:677) > at > org.apache.cayenne.access.IncrementalFaultList.resolveInterval(IncrementalFaultList.java:284) > at > org.apache.cayenne.access.IncrementalFaultList.get(IncrementalFaultList.java:526) > at > org.apache.cayenne.access.IncrementalFaultList$1.next(IncrementalFaultList.java:443) > > Exception arise when running a paginated query, after to calling "toComuni" > method. Not paginated query instead works, as per cayenne 3.0.2. > > Anyway underlaying database isn't oracle but postgress 9.1, jdbc driver > postgresql-9.1-901.jdbc4.jar. > > > 2012/10/5 Andrus Adamchik <[email protected]> > >> Hi, >> >>> If i call the method "toComuni" via reflection it fetchs the related >>> object, but puts it in Hollow state (ex: {<ObjectId:Comuni, >>> comuni_pk=4615>; hollow; []}). >>> >>> I also noticed that if i fetch all "Comuni" objects with a select query, >>> before calling "toComuni" method via reflection, the object state is >>> correcly as Committed. >> >> >> This is expected. Relationships are read lazily. An object read via a >> to-one relationship stays hollow until you call any of its methods. This >> shouldn't cause any problems. >> >>> org.apache.cayenne.CayenneRuntimeException: [v.3.0.2 Jun 11 2011 >> 09:26:09] >>> Can't find id for {<ObjectId:Comuni, comuni_pk=4615>; committed; >>> [toProvince=>?; anagraficheArray=>(..); comuniCap=>55049; >>> comuniComIstat=>33; comuniCfPrefix=>L833; anagraficheArraySl=>(..); >>> comuniDesc=>PROVA]} >>> at >>> >> org.apache.cayenne.access.IncrementalFaultList$IncrementalListHelper.updateWithResolvedObjectInRange(IncrementalFaultList.java:701) >>> at >> >> My guess is that with Oracle NUMERIC Cayenne may read a value for >> "comuni_pk" as a different Java type, depending on whether the object was >> read via relationship or directly from DB. (e.g. Integer vs. BigDecimal or >> something). We had those issues before. If you run this in debugger and >> poke inside ObjectId for Comuni, you will see whether this is the case. >> >> Now how to fix it… first thing to try is to upgrade a step further to >> Cayenne 3.1B1, as it addressed a few of those issues. If that doesn't help, >> we'll keep looking further. >> >> Andrus >> >> >> >> On Oct 5, 2012, at 2:02 AM, Emanuele Maiarelli < >> [email protected]> wrote: >> >>> I tried to figureout a workaround to objects in hollow state. >>> >>> Object value = toCall.invoke(p); // <- p is the getToComuni method >>> if (value instanceof Persistent) >>> { >>> Persistent pr=(Persistent)value; >>> >>> if (pr.getPersistenceState()==PersistenceState.HOLLOW) >>> { >>> c.add(value); >>> >> value=DataObjectUtils.objectForPK(Factory.getContext(), >>> pr.getObjectId()); >>> >>> } >>> >>> >>> } >>> >>> the object after calling "DataObjectUtils.objectForPK(" comes i the >> correct >>> "Commited" state, but however fetching all "comuni" objects after >> reflection >>> throw the same exception, when the query is paginated. >>> >>> That's the stack trace: >>> >>> org.apache.cayenne.CayenneRuntimeException: [v.3.0.2 Jun 11 2011 >> 09:26:09] >>> Can't find id for {<ObjectId:Comuni, comuni_pk=4615>; committed; >>> [toProvince=>?; anagraficheArray=>(..); comuniCap=>55049; >>> comuniComIstat=>33; comuniCfPrefix=>L833; anagraficheArraySl=>(..); >>> comuniDesc=>PROVA]} >>> at >>> >> org.apache.cayenne.access.IncrementalFaultList$IncrementalListHelper.updateWithResolvedObjectInRange(IncrementalFaultList.java:701) >>> at >>> >> org.apache.cayenne.access.IncrementalFaultList.resolveInterval(IncrementalFaultList.java:306) >>> at >>> >> org.apache.cayenne.access.IncrementalFaultList.get(IncrementalFaultList.java:550) >>> at >>> >> org.apache.cayenne.access.IncrementalFaultList$1.next(IncrementalFaultList.java:467) >> >>
