Problem with optional to-one deletion

Lon Varscsak <[email protected]>
Newsgroups gmane.comp.java.cayenne.user
Message-ID <CALAw18x_zkZjn5Lm6XgWYgFGu7HOnoLhZjeFtxnCETn5CuK_NA@mail.gmail.com>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.