Yeah, this is odd indeed. Somehow "uniquing" fails, i.e. the fetched object and 
the current object are thought to be 2 different objects instead of one. In the 
past I've seen it happen on some DBs with "fuzzy" numeric columns. E.g. Cayenne 
the fault object we are trying to resolve would have *Integer* PK of 5, but the 
fetched object would have *BigDecimal* PK of 5, causing ObjectId equality check 
to fail... 

In this case I suggest putting a breakpoint in debugger in 
BaseContext.java:171, and check the contents of "objects" array vs "object". 
See if their ObjectId's are different (Hmm... maybe in the future Cayenne can 
do some assertions itself and create a more descriptive message for the 
Exception).

Andrus


On Apr 24, 2012, at 1:29 PM, Marco Gattei wrote:

> Hi everyone,
> 
>    recentlty i add to rework on a project that used Cayenne 3.0.1 .
> I did two modification:
> 
> -    upgrade to cayenne 3.0.2 ( worked fine )
> -    i had to change (by dba request ) one  of my relationship join, adding 
> another field  in the relationship
> from RICORSI_PENDENTI to VER_CDS  ( field CODENTE)
> 
> When i access one side of the relation ship from RICORSI_PENDENTI to VER_CDS 
> i get this exception.
> 
> 
> 10:06:32,952 INFO  QueryLogger     - SELECT t0.AKEY, t0.CODENTE, 
> t0.NUMEROSOGGETTI, t0.DATARUOLO, t0.DATAACCERTAMENTO, t0.ORAVERBALIZZAZIONE, 
> t0.TARGA, t0.ID_VERBALIZZ1, t0.DATANOTIFICAINGIUNZIONE, t0.ID_VERBALIZZ2, 
> t0.LUOGO_VERB, t0.NUMEROBOLLETTA, t0.TIPOTARGA, t0.RACCOMANDATAVERBALE, 
> t0.SPESEAMMVE, t0.TIPOSUPPLEMENTARE, t0.DATAVERBALE, t0.FLAG_VARI, 
> t0.VERBALIZZANTE1, t0.VERBALIZZANTE2, t0.ID_STRADA2, t0.VERBALIZZANTE3, 
> t0.ID_STRADA1, t0.USOMEZZO, t0.LOCATARIO, t0.SPESEALTRE, t0.TIPOMEZZO, 
> t0.NUMEROCIVICO, t0.PROTOCOLLOVERBALE, t0.DATARICORSO, t0.CODICESINISTRO, 
> t0.DATAVERBALIZZAZIONE, t0.TIPOV, t0.NUMEROREGISTRO, t0.TIPOVERBALE, 
> t0.TIPO_VIOLAZ, t0.STRADA1, t0.STRADA2, t0.DATASPEDIZIONEVERBALE, t0.MODELLO, 
> t0.AUSILIARIO, t0.IMPORTOSANZIONI, t0.NAZIONE, t0.DATATRASMISSIONE, 
> t0.TELAIO, t0.ORAACCERTAMENTO, t0.SPESEPOSTALI, t0.DATATRASMISSIONERICORSO, 
> t0.ID_LUOGO_VERB, t0.ANNOVERBALE, t0.NOMEOPERATORE, t0.KILOMETRO, 
> t0.DATANOTIFICAVERBALE, t0.MARCA, t0.VALUTA, t0.AGENTE2, t0.AGENTE1, 
> t0.STATOVERBALE, t0.ID_SINISTRO, t0.SUBSTATO, t0.DATAARCHIVIAZIONE, 
> t0.RIMOSSO FROM piemme.VER_CDS t0 WHERE (t0.AKEY = ?) AND (t0.CODENTE = ?) 
> [bind: 1:200019405, 2:'H211']
> 10:06:32,968 INFO  QueryLogger     - === returned 1 row. - took 18 ms.
> 10:06:32,972 INFO  QueryLogger     - +++ transaction committed.
> [Click] [error] handleException: org.apache.cayenne.FaultFailureException: 
> [v.3.0.2 apr 20 2012 16:13:44] Error resolving fault for ObjectId: 
> <ObjectId:VerCds, AKEY=200019405, CODENTE=H211> and state (hollow). Possible 
> cause - matching row is missing from the database.
>    at org.apache.cayenne.BaseContext.prepareForAccess(BaseContext.java:171)
>    at 
> org.apache.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:219)
>    at com.sapidata.piemme.domain.VerCds.getAnagrafiche(VerCds.java:50)
>    at com.sapidata.piemme.domain.VerCds.getAnagrafeNotificata(VerCds.java:61)
>    at com.sapidata.ricorsi.web.user.InfoPage.onInit(InfoPage.java:71)
>    at net.sf.click.ClickServlet.processPage(ClickServlet.java:509)
>    at net.sf.click.ClickServlet.handleRequest(ClickServlet.java:331)
>    at net.sf.click.ClickServlet.doGet(ClickServlet.java:250)
>    at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
>    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
>    at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
>    at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>    at 
> net.sf.click.extras.cayenne.DataContextFilter.doFilter(DataContextFilter.java:238)
>    at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>    at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>    at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>    at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
>    at 
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563)
>    at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>    at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
>    at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
>    at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
>    at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
>    at 
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
>    at 
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
>    at 
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
>    at 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
>    at java.lang.Thread.run(Thread.java:662)
> 
> 
> It seems to me that the object VerCds( VER_CDS ) gets fetched from Cayenne, 
> but for some reason i get a Fault where accessing property "anagrafiche" 
> which in turn is a relationship.
> 
> 
> if i get back to a single field relathionship from RICORSI_PENDENTI to 
> VER_CDS i don't get the fault and all the relationship of VER_CDS get 
> correctly fetched:
> 
> 12:21:23,124 INFO  QueryLogger     - SELECT t0.AKEY, t0.CODENTE, 
> t0.NUMEROSOGGETTI, t0.DATARUOLO, t0.DATAACCERTAMENTO, t0.ORAVERBALIZZAZIONE, 
> t0.TARGA, t0.ID_VERBALIZZ1, t0.DATANOTIFICAINGIUNZIONE, t0.ID_VERBALIZZ2, 
> t0.LUOGO_VERB, t0.NUMEROBOLLETTA, t0.TIPOTARGA, t0.RACCOMANDATAVERBALE, 
> t0.SPESEAMMVE, t0.TIPOSUPPLEMENTARE, t0.DATAVERBALE, t0.FLAG_VARI, 
> t0.VERBALIZZANTE1, t0.VERBALIZZANTE2, t0.ID_STRADA2, t0.VERBALIZZANTE3, 
> t0.ID_STRADA1, t0.USOMEZZO, t0.LOCATARIO, t0.SPESEALTRE, t0.TIPOMEZZO, 
> t0.NUMEROCIVICO, t0.PROTOCOLLOVERBALE, t0.DATARICORSO, t0.CODICESINISTRO, 
> t0.DATAVERBALIZZAZIONE, t0.TIPOV, t0.NUMEROREGISTRO, t0.TIPOVERBALE, 
> t0.TIPO_VIOLAZ, t0.STRADA1, t0.STRADA2, t0.DATASPEDIZIONEVERBALE, t0.MODELLO, 
> t0.AUSILIARIO, t0.IMPORTOSANZIONI, t0.NAZIONE, t0.DATATRASMISSIONE, 
> t0.TELAIO, t0.ORAACCERTAMENTO, t0.SPESEPOSTALI, t0.DATATRASMISSIONERICORSO, 
> t0.ID_LUOGO_VERB, t0.ANNOVERBALE, t0.NOMEOPERATORE, t0.KILOMETRO, 
> t0.DATANOTIFICAVERBALE, t0.MARCA, t0.VALUTA, t0.AGENTE2, t0.AGENTE1, 
> t0.STATOVERBALE, t0.ID_SINISTRO, t0.SUBSTATO, t0.DATAARCHIVIAZIONE, 
> t0.RIMOSSO FROM piemme.VER_CDS t0 WHERE t0.AKEY = ? [bind: 1:200019405]
> 12:21:23,130 INFO  QueryLogger     - === returned 1 row. - took 7 ms.
> 12:21:23,130 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,131 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,131 INFO  QueryLogger     - --- transaction started.
> 12:21:23,134 INFO  QueryLogger     - SELECT DISTINCT t0.CODICENOTIFICAING, 
> t0.CODICECONTRIBUENTE, t0.LUOGORESIDENZA, t0.LUOGORILASCIODOCUMENTO, 
> t0.CODFISCOMUNENASCITA, t0.DATANOTIFICAINGIUNZIONE, t0.ANNONASCITA, 
> t0.PROVRESIDENZA, t0.DATAPASSAGGIOPROPRIETA, t0.DATAIDENTIFICAZIONE, 
> t0.SESSO, t0.SPESEPT, t0.CODICEFISCALE, t0.NUMERODOCUMENTO, t0.SOCIETA, 
> t0.CODENTE, t0.LUOGONASCITA, t0.INDIRIZZORESIDENZA, t0.PARTITAIVA, 
> t0.TIPOANAGRAFICA, t0.PARENTPROP, t0.PARENT, t0.DATANOTIFICARUOLO, 
> t0.DOCUMENTO, t0.DATANOTIFICAVERBALE, t0.COGNOME, t0.PROT_REINTEST, 
> t0.SPESEAM, t0.TIPODOCUMENTO, t0.QUINTOC, t0.ORIGINEDATI, t0.DATAAGGDATI, 
> t0.NUMEROREGISTRO, t0.DATADOCUMENTO, t0.ANNO, t0.DATANASCITA, 
> t0.CAPRESIDENZA, t0.NOME, t0.CODICENOTIFICA, t0.AKEY FROM piemme.ANA_CDS t0 
> JOIN piemme.VER_CDS t1 ON (t0.PARENT = t1.AKEY AND t0.CODENTE = t1.CODENTE) 
> WHERE t1.AKEY = ? [bind: 1:200019405]
> 12:21:23,140 INFO  QueryLogger     - === returned 1 row. - took 9 ms.
> 12:21:23,140 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,141 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,141 INFO  QueryLogger     - --- transaction started.
> 12:21:23,144 INFO  QueryLogger     - SELECT DISTINCT t0.DATAREVOCA, 
> t0.ESISTERICORSO, t0.IMPORTOORIGINALE, t0.PROTOCOLLO, 
> t0.DATANOTIFICAINGIUNZIONE, t0.IMPORTOINGIUNZIONE, t0.NUMEROBOLLETTA, 
> t0.SPESENOTINGORIG, t0.DATASTAMPA, t0.SPESENOTIFICAINGIUNZIONE, 
> t0.NUM_RG_RICORSO, t0.PROTRICORSO, t0.NOTE, t0.ESITORICORSOING, t0.CODENTE, 
> t0.ANNOVERBALE, t0.ANNOINGIUNZIONE, t0.SPESEINGIUNZIONE, t0.PARENT, 
> t0.NUMEROINGIUNZIONE, t0.NUMEROREGISTRO, t0.SPEDIRE, t0.DATARICORSOING, 
> t0.DATAINGIUNZIONE, t0.DATAESITORICING, t0.DATASOSPENS, t0.AKEY FROM 
> piemme.CINGIUNZ t0 JOIN piemme.VER_CDS t1 ON (t0.PARENT = t1.AKEY AND 
> t0.CODENTE = t1.CODENTE) WHERE t1.AKEY = ? [bind: 1:200019405]
> 12:21:23,147 INFO  QueryLogger     - === returned 0 rows. - took 5 ms.
> 12:21:23,147 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,148 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,148 INFO  QueryLogger     - --- transaction started.
> 12:21:23,153 INFO  QueryLogger     - SELECT DISTINCT t0.GP_MANDDTBENE, 
> t0.CONTRODEDUFFICIO, t0.DTRIMB_SPESEACC, t0.GP_MANDDTRICH, 
> t0.RIFERIMENTI_RIMB, t0.GP_DTDISPOS, t0.GP_TIPOSOSP, t0.GP_NUMRG, 
> t0.NUMEROBOLLETTA, t0.DTRICOUT, t0.GP_DTSOSPFIN, t0.DATA_RIC_PREF, 
> t0.PROTRICOUT, t0.DESCNOPROCED, t0.GP_DISPFL1, t0.GP_ISSPESE, 
> t0.GP_PROTRICOUT, t0.DT_OPERATORE, t0.GP_DISPFL2, t0.GP_DTUDIENZEDONE, 
> t0.DATATRASMPREFETTO2, t0.CATEGORIARICORSO, t0.DATATRASMPREFETTO3, 
> t0.RIFRIMB_SPESEACC, t0.GP_DTTRASMATTI, t0.GP_GGVALPAGA, t0.NOME_OPERATORE, 
> t0.DATA_RICHIESTARIMB, t0.GP_DTUDIENZANEXT, t0.DATARICORSO, t0.PARENT, 
> t0.GP_DTSOSPIN, t0.MOTIVAZIONI, t0.CODENTE, t0.GP_IMPSPES, t0.NUMEROREGISTRO, 
> t0.OBBL_CDEDAGENT, t0.DATASTCONTROD, t0.CODPAG, t0.DATA_BENESTARERRIMB, 
> t0.DISPONIBILE, t0.GP_NOTE_MOTIVAZ, t0.GP_DISPDT2, t0.GP_NOMEGP, 
> t0.GP_DISPDT1, t0.GP_DTVALINI, t0.GP_IMPSANZ, t0.GP_DTRICOUT, t0.AKEY, 
> t0.RICEVUTA, t0.RICORSOTARDIVO, t0.IMPRIMB_SPESEACC, t0.GP_IMPSANZRUO, 
> t0.AUDIZIONE_TIPO, t0.NOTE, t0.AUTORITAGIUDIZIARIA, t0.GP_DISPCHAR3, 
> t0.PROT_RIC_PREF, t0.GP_SPESEPROC, t0.GP_DISPCHAR1, t0.ANNOVERBALE, 
> t0.CONTRODEDUZIONE, t0.GP_DISPCHAR2, t0.PROTOCOLLORICORSO, t0.GP_PROTSPESE, 
> t0.GP_PROTDISPOS, t0.PROTOCOLLOPREFETTO, t0.PROCOTOLLOPREFETTO2, t0.VALUTA, 
> t0.GP_MANDNUM, t0.ESITORICORSO, t0.GP_IMPSPESRUO, t0.PROTOCOLLOPREFETTO3, 
> t0.ANNORICORSO, t0.DATAESITO, t0.DATATRASMPREFETTO, t0.AUDIZIONE, 
> t0.GP_DTSPESE FROM piemme.CRICORSI t0 JOIN piemme.VER_CDS t1 ON (t0.PARENT = 
> t1.AKEY AND t0.CODENTE = t1.CODENTE) WHERE t1.AKEY = ? [bind: 1:200019405]
> 12:21:23,162 INFO  QueryLogger     - === returned 1 row. - took 14 ms.
> 12:21:23,162 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,167 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,167 INFO  QueryLogger     - --- transaction started.
> 12:21:23,173 INFO  QueryLogger     - {? = call 
> piemme.GIORNONONFESTIVONEGATIVO(?, ?)} [bind: 1:'[OUT]', 2:'2008-02-11 
> 00:00:00.0', 3:-10]
> 12:21:23,196 INFO  QueryLogger     - === returned 1 row. - took 0 ms.
> 12:21:23,197 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,202 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,202 INFO  QueryLogger     - --- transaction started.
> 12:21:23,204 INFO  QueryLogger     - SELECT DISTINCT t0.CODENTE, 
> t0.PREF_RIFCONF, t0.ANNOVERBALE, t0.PROTOCOLLO, t0.AKEY, t0.CODICECAUSALE, 
> t0.PARENT, t0.PREF_RIFTRASM, t0.NUMEROBOLLETTA, t0.PREF_DTTRASM, 
> t0.NUMEROARCHIVIAZIONE, t0.DATASTAMPA, t0.NUMEROREGISTRO, t0.PREF_DTCONF, 
> t0.DATAST_LETTERA, t0.ANNOORDINANZA, t0.DATAARCHIVIAZIONE, 
> t0.CAUSALEARCHIVIAZIONE FROM PIEMME.CARCHIV t0 JOIN piemme.VER_CDS t1 ON 
> (t0.PARENT = t1.AKEY AND t0.CODENTE = t1.CODENTE) WHERE t1.AKEY = ? [bind: 
> 1:200019405]
> 12:21:23,207 INFO  QueryLogger     - === returned 0 rows. - took 5 ms.
> 12:21:23,207 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,208 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,209 INFO  QueryLogger     - --- transaction started.
> 12:21:23,212 INFO  QueryLogger     -  SELECT V.*  FROM PIEMME.VER_CDS 
> V,PIEMME.T180PP T  WHERE T.PARENT2_180_8 =  200019405  AND T.CODENTE = ? AND 
> T.PARENT = V.akey AND T.CODENTE = V.CODENTE [bind: 1:'H211']
> 12:21:23,222 INFO  QueryLogger     - === returned 0 rows. - took 10 ms.
> 12:21:23,223 INFO  QueryLogger     - +++ transaction committed.
> 12:21:23,223 INFO  QueryLogger     - --- will run 1 query.
> 12:21:23,224 INFO  QueryLogger     - --- transaction started.
> 12:21:23,225 INFO  QueryLogger     -  SELECT V.*  from PIEMME.VER_CDS V, 
> PIEMME.T180 T  WHERE T.PARENT2_180_8 =  200019405 AND T.CODENTE = ? AND 
> T.PARENT = V.akey AND T.CODENTE = V.CODENTE [bind: 1:'H211']
> 12:21:23,229 INFO  QueryLogger     - === returned 0 rows. - took 4 ms.
> 12:21:23,230 INFO  QueryLogger     - +++ transaction committed.
> 
> I think i'm missing somthing in the modeler or my absution of simply adding a 
> filed to the RICORSI_PENDENTI --> VER_CDS relationship is wrong.
> 
> I hope i've expressed my problem with enough clarity .....
> Can somebody please provide some hint to put me in the rigth direction ?
> 
> Of cource i can fetch Data Rows wrinting an SQLTemplate script for resolving 
> relatiohns on the DB and then manage relathioship programatically, but i 
> would like to use SelectQuery with prefetch instead.
> 
> Thanks, Marco
> 
> 

Reply via email to