Hi Mike, Nikita mentioned a few hours ago that he was able to reproduce. Appears to be a bug in the 4.2 stack.
Andrus > On Nov 17, 2021, at 7:44 PM, Michael Gentry <blackn...@gmail.com> wrote: > > Hi Lon, > > I didn't have a lot of time to look into it, but I suspect it may be in > your PK/FK mapping on the DbEntities. > > For example, in order_header, you have order_header ->> order_detail_sales, > but you've mapped that as To-Many AND To-Dependent PK, which doesn't make > sense. > > > On Tue, Nov 16, 2021 at 6:14 PM Lon Varscsak <lon.varsc...@gmail.com> wrote: > >> I forgot to mention that I'm running 4.2.M4-SNAPSHOT (updated from github >> as of an hour ago). >> >> On Tue, Nov 16, 2021 at 4:06 PM Lon Varscsak <lon.varsc...@gmail.com> >> wrote: >> >>> Hey all, >>> >>> I have a setup where I have an optional to-one relationship, but when I >>> try to clear the relationship and commitChanges, I get a low-level >> Cayenne >>> error along with some in appropriate sql generated. >>> >>> where it's doing an UPDATE to order_detail_costs should be a no-op, >>> because the object was removed from it's parent (order_detail_sales) with >>> setOrderDetailCost(null) along with a >>> objectContext.deleteObject(orderDetailCost). This is probably a problem >>> for Nikita to look at, but I figured someone else may have run into this >> as >>> well. It's unusual for me to have optional to-one relationships, but it >>> does happen. >>> >>> Here is a sample project (Debug As -> Java Application) to try (link to >> my >>> Synology): >>> >> https://varscsak.synology.me:5001/d/s/mI7SBS6fApoUMNT1K5lfpaCXHKEkHkgd/jIy5Ug64Hjp2ieZzOceknc39sjBasJLE-T74gPgqKEgk >>> >>> ...snip... >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - INSERT >>> INTO "order_header"( "attribute_1", "attribute_2", "order_number") >> VALUES( >>> ?, ?, ?) >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - [bind: >>> 1->attribute_1:'TEST1', 2->attribute_2:1, 3->order_number:1] >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - === >>> updated 1 row. >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - INSERT >>> INTO "order_detail_sales"( "detail_attr_1", "detail_attr_2", >>> "order_line_number", "order_number") VALUES( ?, ?, ?, ?) >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - [bind: >>> 1->detail_attr_1:'TEST1', 2->detail_attr_2:1, 3->order_line_number:1, >>> 4->order_number:1] >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - === >>> updated 1 row. >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - UPDATE >>> "order_detail_costs" SET "order_number" = ?, "order_line_number" = ? >> WHERE >>> ( "order_line_number" = ? ) AND ( "order_number" = ? ) >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - *** >> error. >>> >>> java.lang.UnsupportedOperationException >>> >>> at java.util.Collections$UnmodifiableMap.put(Collections.java:1459) >>> >>> at org.apache.cayenne.query.BatchQueryRow.getValue(BatchQueryRow.java:80) >>> >>> at org.apache.cayenne.query.UpdateBatchQuery$1.getValue( >>> UpdateBatchQuery.java:124) >>> >>> at >>> >> org.apache.cayenne.access.translator.batch.UpdateBatchTranslator.updateBindings( >>> UpdateBatchTranslator.java:80) >>> >>> at org.apache.cayenne.access.jdbc.BatchAction.runAsIndividualQueries( >>> BatchAction.java:191) >>> >>> at org.apache.cayenne.access.jdbc.BatchAction.performAction( >>> BatchAction.java:93) >>> >>> at org.apache.cayenne.access.DataNodeQueryAction.runQuery( >>> DataNodeQueryAction.java:97) >>> >>> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273) >>> >>> at >>> >> org.apache.cayenne.access.flush.DefaultDataDomainFlushAction.lambda$executeQueries$6( >>> DefaultDataDomainFlushAction.java:177) >>> >>> at java.util.HashMap.forEach(HashMap.java:1290) >>> >>> at >>> >> org.apache.cayenne.access.flush.DefaultDataDomainFlushAction.executeQueries( >>> DefaultDataDomainFlushAction.java:176) >>> >>> at org.apache.cayenne.access.flush.DefaultDataDomainFlushAction.flush( >>> DefaultDataDomainFlushAction.java:89) >>> >>> at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:637) >>> >>> at org.apache.cayenne.access.DataDomain.onSyncNoFilters( >>> DataDomain.java:609) >>> >>> at org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync( >>> DataDomain.java:835) >>> >>> at org.apache.cayenne.tx.TransactionFilter.lambda$onSync$0( >>> TransactionFilter.java:61) >>> >>> at >>> >> org.apache.cayenne.tx.DefaultTransactionManager$BaseTransactionHandler.performInTransaction( >>> DefaultTransactionManager.java:180) >>> >>> at >>> >> org.apache.cayenne.tx.DefaultTransactionManager$BaseTransactionHandler.performInNewTransaction( >>> DefaultTransactionManager.java:152) >>> >>> at >>> >> org.apache.cayenne.tx.DefaultTransactionManager$NestedTransactionHandler.handle( >>> DefaultTransactionManager.java:95) >>> >>> at org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction( >>> DefaultTransactionManager.java:62) >>> >>> at org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction( >>> DefaultTransactionManager.java:40) >>> >>> at org.apache.cayenne.tx.TransactionFilter.onSync( >>> TransactionFilter.java:61) >>> >>> at org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync( >>> DataDomain.java:834) >>> >>> at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:596) >>> >>> at org.apache.cayenne.access.DataContext.flushToParent( >>> DataContext.java:737) >>> >>> at org.apache.cayenne.access.DataContext.commitChanges( >>> DataContext.java:686) >>> >>> at com.smarthealth.cayennetest.App.main(App.java:38) >>> >>> Nov 16 15:27:55 INFO org.apache.cayenne.log.JdbcEventLogger - *** >>> transaction rolledback. >>> >>> org.apache.cayenne.CayenneRuntimeException: [v.4.2.M4-SNAPSHOT Nov 16 >>> 2021 22:12:02] Commit Exception >>> >>> at org.apache.cayenne.access.DataContext.flushToParent( >>> DataContext.java:769) >>> >>> at org.apache.cayenne.access.DataContext.commitChanges( >>> DataContext.java:686) >>> >>> at com.smarthealth.cayennetest.App.main(App.java:38) >>> >>> Caused by: java.lang.UnsupportedOperationException >>> >>> at java.util.Collections$UnmodifiableMap.put(Collections.java:1459) >>> >>> at org.apache.cayenne.query.BatchQueryRow.getValue(BatchQueryRow.java:80) >>> >>> at org.apache.cayenne.query.UpdateBatchQuery$1.getValue( >>> UpdateBatchQuery.java:124) >>> >>> at >>> >> org.apache.cayenne.access.translator.batch.UpdateBatchTranslator.updateBindings( >>> UpdateBatchTranslator.java:80) >>> >>> at org.apache.cayenne.access.jdbc.BatchAction.runAsIndividualQueries( >>> BatchAction.java:191) >>> >>> at org.apache.cayenne.access.jdbc.BatchAction.performAction( >>> BatchAction.java:93) >>> >>> at org.apache.cayenne.access.DataNodeQueryAction.runQuery( >>> DataNodeQueryAction.java:97) >>> >>> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273) >>> >>> at >>> >> org.apache.cayenne.access.flush.DefaultDataDomainFlushAction.lambda$executeQueries$6( >>> DefaultDataDomainFlushAction.java:177) >>> >>> at java.util.HashMap.forEach(HashMap.java:1290) >>> >>> at >>> >> org.apache.cayenne.access.flush.DefaultDataDomainFlushAction.executeQueries( >>> DefaultDataDomainFlushAction.java:176) >>> >>> at org.apache.cayenne.access.flush.DefaultDataDomainFlushAction.flush( >>> DefaultDataDomainFlushAction.java:89) >>> >>> at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:637) >>> >>> at org.apache.cayenne.access.DataDomain.onSyncNoFilters( >>> DataDomain.java:609) >>> >>> at org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync( >>> DataDomain.java:835) >>> >>> at org.apache.cayenne.tx.TransactionFilter.lambda$onSync$0( >>> TransactionFilter.java:61) >>> >>> at >>> >> org.apache.cayenne.tx.DefaultTransactionManager$BaseTransactionHandler.performInTransaction( >>> DefaultTransactionManager.java:180) >>> >>> at >>> >> org.apache.cayenne.tx.DefaultTransactionManager$BaseTransactionHandler.performInNewTransaction( >>> DefaultTransactionManager.java:152) >>> >>> at >>> >> org.apache.cayenne.tx.DefaultTransactionManager$NestedTransactionHandler.handle( >>> DefaultTransactionManager.java:95) >>> >>> at org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction( >>> DefaultTransactionManager.java:62) >>> >>> at org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction( >>> DefaultTransactionManager.java:40) >>> >>> at org.apache.cayenne.tx.TransactionFilter.onSync( >>> TransactionFilter.java:61) >>> >>> at org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync( >>> DataDomain.java:834) >>> >>> at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:596) >>> >>> at org.apache.cayenne.access.DataContext.flushToParent( >>> DataContext.java:737) >>> >>> ... 2 more >>> >>> >>> >>