You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Jeremias Maerki <de...@jeremias-maerki.ch> on 2009/08/14 15:19:22 UTC

Problem with reverse relationships and inheritance

I think I may have run into an issue that is related to this thread:
http://markmail.org/message/slm4joyswjp77vzi

- I have an (abstract) entity A and two subentities/subclasses A1 and A2.
- I have an (abstract) entity B with three subentities B1, B2 and B3.
- There is a 1:n relationship from A to B.

Now, if I create an instance of A1 and use addToB() to add a B1 instance,
B1 is added to the list. But I get a validation error because upon
commit the foreign key for the A1 instance is not set on the B1 instance.

Debugging, I found that ObjRelationship.getReverseRelationship() didn't
look in super entities for the reverse relationship.

Mindlessly changing that method (in Trunk) from:

        Entity src = this.getSourceEntity();

        Iterator<?> it = target.getRelationships().iterator();
        while (it.hasNext()) {
            ObjRelationship rel = (ObjRelationship) it.next();
            if (rel.getTargetEntity() != src)
                continue;

to:

        Entity src = this.getSourceEntity();

        Iterator<?> it = target.getRelationships().iterator();
        while (it.hasNext()) {
            ObjRelationship rel = (ObjRelationship) it.next();
            Entity relTarget = rel.getTargetEntity();
            ObjEntity currentSrc = (ObjEntity)src;
            while (currentSrc != null) {
                if (relTarget == currentSrc) {
                    break;
                }
                currentSrc = currentSrc.getSuperEntity();
            }
            if (src == null) {
                continue;
            }

...solves my immediate problem, but I have no idea about any
side-effects. Am I doing anything wrong?

Thanks,
Jeremias Maerki


Re: Problem with reverse relationships and inheritance

Posted by Andrus Adamchik <an...@objectstyle.org>.
Yeah, sorry about messing that up :-)

On Aug 26, 2009, at 5:39 PM, Andrey Razumovsky wrote:

> BTW, it seems my problems were caused by another code, that  
> belonging to
> CAY-132. As now this is fixed on the trunk, we can proceed with that  
> one
>
> 2009/8/17 Jeremias Maerki <de...@jeremias-maerki.ch>
>
>> Thanks, Andrey. I somehow missed that. I'll see if I can allocate  
>> time
>> to write a test case. That could help speed things up.
>>
>> On 16.08.2009 22:01:17 Andrey Razumovsky wrote:
>>> Hi Jeremias,
>>>
>>> This is also known as CAY-1009:
>>> http://issues.apache.org/jira/browse/CAY-1009
>>>
>>> I tried patch from there (and it looks like yours) but there WERE  
>>> side
>>> effects (I listed them in JIRA). At the moment I was forced to  
>>> make the
>>> relationship non-mandatory in my project (and validate in different
>> ways). I
>>> would really like to get it fixed, but I haven't found time for that
>> yet...
>>> Please watch the JIRA to be notified of the updates
>>>
>>> Regards,
>>> Andrey
>>>
>>> 2009/8/14 Jeremias Maerki <de...@jeremias-maerki.ch>
>>>
>>>> I think I may have run into an issue that is related to this  
>>>> thread:
>>>> http://markmail.org/message/slm4joyswjp77vzi
>>>>
>>>> - I have an (abstract) entity A and two subentities/subclasses A1  
>>>> and
>> A2.
>>>> - I have an (abstract) entity B with three subentities B1, B2 and  
>>>> B3.
>>>> - There is a 1:n relationship from A to B.
>>>>
>>>> Now, if I create an instance of A1 and use addToB() to add a B1
>> instance,
>>>> B1 is added to the list. But I get a validation error because upon
>>>> commit the foreign key for the A1 instance is not set on the B1
>> instance.
>>>>
>>>> Debugging, I found that ObjRelationship.getReverseRelationship()  
>>>> didn't
>>>> look in super entities for the reverse relationship.
>>>>
>>>> Mindlessly changing that method (in Trunk) from:
>>>>
>>>>       Entity src = this.getSourceEntity();
>>>>
>>>>       Iterator<?> it = target.getRelationships().iterator();
>>>>       while (it.hasNext()) {
>>>>           ObjRelationship rel = (ObjRelationship) it.next();
>>>>           if (rel.getTargetEntity() != src)
>>>>               continue;
>>>>
>>>> to:
>>>>
>>>>       Entity src = this.getSourceEntity();
>>>>
>>>>       Iterator<?> it = target.getRelationships().iterator();
>>>>       while (it.hasNext()) {
>>>>           ObjRelationship rel = (ObjRelationship) it.next();
>>>>           Entity relTarget = rel.getTargetEntity();
>>>>           ObjEntity currentSrc = (ObjEntity)src;
>>>>           while (currentSrc != null) {
>>>>               if (relTarget == currentSrc) {
>>>>                   break;
>>>>               }
>>>>               currentSrc = currentSrc.getSuperEntity();
>>>>           }
>>>>           if (src == null) {
>>>>               continue;
>>>>           }
>>>>
>>>> ...solves my immediate problem, but I have no idea about any
>>>> side-effects. Am I doing anything wrong?
>>>>
>>>> Thanks,
>>>> Jeremias Maerki
>>>>
>>>>
>>
>>
>>
>>
>> Jeremias Maerki
>>
>>


Re: Problem with reverse relationships and inheritance

Posted by Andrey Razumovsky <ra...@gmail.com>.
BTW, it seems my problems were caused by another code, that belonging to
CAY-132. As now this is fixed on the trunk, we can proceed with that one

2009/8/17 Jeremias Maerki <de...@jeremias-maerki.ch>

> Thanks, Andrey. I somehow missed that. I'll see if I can allocate time
> to write a test case. That could help speed things up.
>
> On 16.08.2009 22:01:17 Andrey Razumovsky wrote:
> > Hi Jeremias,
> >
> > This is also known as CAY-1009:
> > http://issues.apache.org/jira/browse/CAY-1009
> >
> > I tried patch from there (and it looks like yours) but there WERE side
> > effects (I listed them in JIRA). At the moment I was forced to make the
> > relationship non-mandatory in my project (and validate in different
> ways). I
> > would really like to get it fixed, but I haven't found time for that
> yet...
> > Please watch the JIRA to be notified of the updates
> >
> > Regards,
> > Andrey
> >
> > 2009/8/14 Jeremias Maerki <de...@jeremias-maerki.ch>
> >
> > > I think I may have run into an issue that is related to this thread:
> > > http://markmail.org/message/slm4joyswjp77vzi
> > >
> > > - I have an (abstract) entity A and two subentities/subclasses A1 and
> A2.
> > > - I have an (abstract) entity B with three subentities B1, B2 and B3.
> > > - There is a 1:n relationship from A to B.
> > >
> > > Now, if I create an instance of A1 and use addToB() to add a B1
> instance,
> > > B1 is added to the list. But I get a validation error because upon
> > > commit the foreign key for the A1 instance is not set on the B1
> instance.
> > >
> > > Debugging, I found that ObjRelationship.getReverseRelationship() didn't
> > > look in super entities for the reverse relationship.
> > >
> > > Mindlessly changing that method (in Trunk) from:
> > >
> > >        Entity src = this.getSourceEntity();
> > >
> > >        Iterator<?> it = target.getRelationships().iterator();
> > >        while (it.hasNext()) {
> > >            ObjRelationship rel = (ObjRelationship) it.next();
> > >            if (rel.getTargetEntity() != src)
> > >                continue;
> > >
> > > to:
> > >
> > >        Entity src = this.getSourceEntity();
> > >
> > >        Iterator<?> it = target.getRelationships().iterator();
> > >        while (it.hasNext()) {
> > >            ObjRelationship rel = (ObjRelationship) it.next();
> > >            Entity relTarget = rel.getTargetEntity();
> > >            ObjEntity currentSrc = (ObjEntity)src;
> > >            while (currentSrc != null) {
> > >                if (relTarget == currentSrc) {
> > >                    break;
> > >                }
> > >                currentSrc = currentSrc.getSuperEntity();
> > >            }
> > >            if (src == null) {
> > >                continue;
> > >            }
> > >
> > > ...solves my immediate problem, but I have no idea about any
> > > side-effects. Am I doing anything wrong?
> > >
> > > Thanks,
> > > Jeremias Maerki
> > >
> > >
>
>
>
>
> Jeremias Maerki
>
>

Re: Problem with reverse relationships and inheritance

Posted by Jeremias Maerki <de...@jeremias-maerki.ch>.
Thanks, Andrey. I somehow missed that. I'll see if I can allocate time
to write a test case. That could help speed things up.

On 16.08.2009 22:01:17 Andrey Razumovsky wrote:
> Hi Jeremias,
> 
> This is also known as CAY-1009:
> http://issues.apache.org/jira/browse/CAY-1009
> 
> I tried patch from there (and it looks like yours) but there WERE side
> effects (I listed them in JIRA). At the moment I was forced to make the
> relationship non-mandatory in my project (and validate in different ways). I
> would really like to get it fixed, but I haven't found time for that yet...
> Please watch the JIRA to be notified of the updates
> 
> Regards,
> Andrey
> 
> 2009/8/14 Jeremias Maerki <de...@jeremias-maerki.ch>
> 
> > I think I may have run into an issue that is related to this thread:
> > http://markmail.org/message/slm4joyswjp77vzi
> >
> > - I have an (abstract) entity A and two subentities/subclasses A1 and A2.
> > - I have an (abstract) entity B with three subentities B1, B2 and B3.
> > - There is a 1:n relationship from A to B.
> >
> > Now, if I create an instance of A1 and use addToB() to add a B1 instance,
> > B1 is added to the list. But I get a validation error because upon
> > commit the foreign key for the A1 instance is not set on the B1 instance.
> >
> > Debugging, I found that ObjRelationship.getReverseRelationship() didn't
> > look in super entities for the reverse relationship.
> >
> > Mindlessly changing that method (in Trunk) from:
> >
> >        Entity src = this.getSourceEntity();
> >
> >        Iterator<?> it = target.getRelationships().iterator();
> >        while (it.hasNext()) {
> >            ObjRelationship rel = (ObjRelationship) it.next();
> >            if (rel.getTargetEntity() != src)
> >                continue;
> >
> > to:
> >
> >        Entity src = this.getSourceEntity();
> >
> >        Iterator<?> it = target.getRelationships().iterator();
> >        while (it.hasNext()) {
> >            ObjRelationship rel = (ObjRelationship) it.next();
> >            Entity relTarget = rel.getTargetEntity();
> >            ObjEntity currentSrc = (ObjEntity)src;
> >            while (currentSrc != null) {
> >                if (relTarget == currentSrc) {
> >                    break;
> >                }
> >                currentSrc = currentSrc.getSuperEntity();
> >            }
> >            if (src == null) {
> >                continue;
> >            }
> >
> > ...solves my immediate problem, but I have no idea about any
> > side-effects. Am I doing anything wrong?
> >
> > Thanks,
> > Jeremias Maerki
> >
> >




Jeremias Maerki


Re: Problem with reverse relationships and inheritance

Posted by Andrey Razumovsky <ra...@gmail.com>.
Hi Jeremias,

This is also known as CAY-1009:
http://issues.apache.org/jira/browse/CAY-1009

I tried patch from there (and it looks like yours) but there WERE side
effects (I listed them in JIRA). At the moment I was forced to make the
relationship non-mandatory in my project (and validate in different ways). I
would really like to get it fixed, but I haven't found time for that yet...
Please watch the JIRA to be notified of the updates

Regards,
Andrey

2009/8/14 Jeremias Maerki <de...@jeremias-maerki.ch>

> I think I may have run into an issue that is related to this thread:
> http://markmail.org/message/slm4joyswjp77vzi
>
> - I have an (abstract) entity A and two subentities/subclasses A1 and A2.
> - I have an (abstract) entity B with three subentities B1, B2 and B3.
> - There is a 1:n relationship from A to B.
>
> Now, if I create an instance of A1 and use addToB() to add a B1 instance,
> B1 is added to the list. But I get a validation error because upon
> commit the foreign key for the A1 instance is not set on the B1 instance.
>
> Debugging, I found that ObjRelationship.getReverseRelationship() didn't
> look in super entities for the reverse relationship.
>
> Mindlessly changing that method (in Trunk) from:
>
>        Entity src = this.getSourceEntity();
>
>        Iterator<?> it = target.getRelationships().iterator();
>        while (it.hasNext()) {
>            ObjRelationship rel = (ObjRelationship) it.next();
>            if (rel.getTargetEntity() != src)
>                continue;
>
> to:
>
>        Entity src = this.getSourceEntity();
>
>        Iterator<?> it = target.getRelationships().iterator();
>        while (it.hasNext()) {
>            ObjRelationship rel = (ObjRelationship) it.next();
>            Entity relTarget = rel.getTargetEntity();
>            ObjEntity currentSrc = (ObjEntity)src;
>            while (currentSrc != null) {
>                if (relTarget == currentSrc) {
>                    break;
>                }
>                currentSrc = currentSrc.getSuperEntity();
>            }
>            if (src == null) {
>                continue;
>            }
>
> ...solves my immediate problem, but I have no idea about any
> side-effects. Am I doing anything wrong?
>
> Thanks,
> Jeremias Maerki
>
>