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
>>> 
>>> 
>>> 
>> 

Reply via email to