Hi Amadeo, thanks for the pointer. No, the reverse relationship doesn't matter (and removing it doesn't help). I have now removed it in the github repo.
And this is reproducible in different projects, I just created this smalll project to serve as an isolated runnable example. - hugi > On 8 Sep 2017, at 14:20, Amedeo Mantica <[email protected]> wrote: > > I see an untitledRel in the Model, it looks like to be a stub inverse > relationship... have you tried to remove it ? > > Amedeo > >> On 8 Sep 2017, at 14:05, Hugi Thordarson <[email protected]> wrote: >> >> Hi all, >> I'm encountering what I believe to be a bug, that someone more familiar with >> Cayenne's internals than me might want to take a look at :) >> >> In short: If I create a new DataObject, add it to two different >> relationships on another object and then attempt to commit the whole >> thing—it fails. >> >> Consider the following code: >> >> ObjectContext oc = createContext(); >> Person person = oc.newObject( Person.class ); >> Address address = oc.newObject( Address.class ); >> person.addToAddresses( address ); >> person.setLatestAddress( address ); >> >> oc.commitChanges(); >> >> This will result in the following exception: >> >> Exception in thread "main" org.apache.cayenne.CayenneRuntimeException: >> [v.4.1.M1-SNAPSHOT Aug 31 2017 12:03:09] Can't extract a master key. Missing >> key (id), master ID (<ObjectId:Person, TEMP:00000058A5520119>) >> at >> org.apache.cayenne.access.DataDomainSyncBucket$PropagatedValueFactory.get(DataDomainSyncBucket.java:290) >> at >> org.apache.cayenne.query.BatchQueryRow.getValue(BatchQueryRow.java:64) >> at >> org.apache.cayenne.query.InsertBatchQuery$1.getValue(InsertBatchQuery.java:63) >> at >> org.apache.cayenne.access.translator.batch.InsertBatchTranslator.doUpdateBindings(InsertBatchTranslator.java:121) >> at >> org.apache.cayenne.access.translator.batch.DefaultBatchTranslator.updateBindings(DefaultBatchTranslator.java:78) >> at >> org.apache.cayenne.access.jdbc.BatchAction.runAsIndividualQueries(BatchAction.java:163) >> at >> org.apache.cayenne.access.jdbc.BatchAction.performAction(BatchAction.java:87) >> at >> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97) >> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:293) >> at >> org.apache.cayenne.access.DataDomainFlushAction.runQueries(DataDomainFlushAction.java:233) >> at >> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:153) >> at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:633) >> at >> org.apache.cayenne.access.DataDomain.onSyncNoFilters(DataDomain.java:603) >> at >> org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764) >> at >> org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:73) >> at >> org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:70) >> at >> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:87) >> at >> org.apache.cayenne.tx.DefaultTransactionManager.performInLocalTransaction(DefaultTransactionManager.java:59) >> at >> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:52) >> at >> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:40) >> at >> org.apache.cayenne.tx.TransactionFilter.onSync(TransactionFilter.java:70) >> at >> org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764) >> at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:590) >> at >> org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:742) >> at >> org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:691) >> at pktest.Main.main(Main.java:28) >> >> >> >> If someone would like to have a look, I've created a project that replicates >> the problem—just build it and run pktest.Main >> >> https://github.com/hugith/pktest <https://github.com/hugith/pktest> >> >> Cheers, >> - hugi >
