[ 
https://issues.apache.org/jira/browse/CAY-2792?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17685377#comment-17685377
 ] 

Nikita Timofeev commented on CAY-2792:
--------------------------------------

[~mattraydub] Fix is perfect, thanks! Tests are failing because there's a 
problem with the new property, as there's a client counter-part for the 
{{Reflexive}} entity that is not updated. Unfortunately this was hidden by the 
random failure on Derby. I believe it should be good to just run {{cgen}} in 
client mode.
If you could do this I'll just go ahead and merge your PR. Or if there's any 
trouble I could do it once I'll have some time.

> Fix Insertion Order For Reflexive DataObjects
> ---------------------------------------------
>
>                 Key: CAY-2792
>                 URL: https://issues.apache.org/jira/browse/CAY-2792
>             Project: Cayenne
>          Issue Type: Bug
>          Components: Core Library
>    Affects Versions: 4.2.RC2, 4.2.RC1
>         Environment: Java 17
>            Reporter: Matt Watson
>            Assignee: Nikita Timofeev
>            Priority: Critical
>             Fix For: 4.2, 5.0.M1
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> For terminology's sake, I assume _Reflexive_ refers to when you have 2 
> objects of the same Model, that are related, in this case, parent/child 
> (ToOne/HasMany). If this assumption is incorrect we can rename the title.
> For a little history on this, we never encountered this bug until we upgraded 
> to {{4.2.RC1}}, and I recently tested on {{4.2.RC2}} and the bug still exists.
> For a while I thought this was only a bug in our environment, thinking that 
> our code was causing the issue because Cayenne has a passing test in 
> {{CayenneDataObjectRelationshipsIT.testReflexiveRelationshipInsertOrder1}}. 
> But as I got to digging, the error occurs when the parent also has a 
> relationship to some "Other" object that is not of the same model.
> The [pull request|https://github.com/apache/cayenne/pull/563] has a breaking 
> test. I have not worked on a fix yet, but will begin investigating. I suspect 
> it has to do with the work done in CAY-2571, but I am not certain yet.
> The issue is that Cayenne randomly tries to commit the child record in front 
> of the parent record, therefore the database throws a Foreign Key error, 
> since the parent does not yet exist when the child is inserted. Because of 
> this randomness, my breaking test attempts this process 100 times. You will 
> also see another test that passes with the same Models but without setting 
> the "ToOne" Other object.
> here is a look at the code that "randomly" fails:
> {code:java}
>     public void addReflexiveParentAndChildWithOtherRelationshipOnParent() {
>         // can add Reflexive Parent (that belongsTo Other) and Child,
>         // we will do this 100 times, because it randomly does it 
> correctly/incorrectly
>         // given some "other" Object
>         final Other other = context.newObject(Other.class);
>         other.setName("OtherB");
>         context.commitChanges();
>         final int attempts = 100;
>         int errors = 0;
>         for (int i = 0; i < attempts; i++) {
>             // when parent is created and associated to "Other"
>             final Reflexive parent = context.newObject(Reflexive.class);
>             parent.setName("parentB"+i);
>             parent.setToOther(other);
>             // and child is created and associated to "Parent"
>             final Reflexive child = context.newObject(Reflexive.class);
>             child.setName("childB"+i);
>             child.setToParent(parent);
>             try {
>                 context.commitChanges();
>             } catch (final Exception e) {
>                 errors++;
>                 e.printStackTrace();
>                 context.rollbackChanges();
>             }
>         }
>         // then no error occurred
>         assertEquals(String.format("Failed on %s of %s attempts.", errors, 
> attempts), 0, errors);
>     }
> {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to