Re: Problem with optional to-one deletion

Andrus Adamchik <[email protected]>
Newsgroups gmane.comp.java.cayenne.user
Message-ID <[email protected]>
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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>> 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
>>> 
>>> 
>>> 
>>
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.