Re: merging relationships

From: Marcin Skladaniec (marci..sh.com.au)
Date: Fri Jan 18 2008 - 16:45:42 EST

  • Next message: Daniel Kvasnička jr.: "Re: CayenneRuntimeException: Can't find id"

    Hello

    Using the naming from the code snippet: The problem is that the
    'value' already exists in the 'destination', and it is added for the
    second time. It is fairly easy to avoid it from happening:

            List<PersistentObject> sourceRelations = new
    ArrayList<PersistentObject>(source.getValueForKey(property));
            List<PersistentObject> initialDestinationRelations = new
    ArrayList<PersistentObject>(destination.getValueForKey(property));
            
            for (PersistentObject po : sourceRelations) {
                    if (!initialDestinationRelations.contains(po)) {
                            source.removeValueForKey(property, po);
                            destination.addValueForKey(property, po);
                    }
            }

    I think it is a small bug and for simple flattened many-to-many
    relation cayenne should deal with it internally.
    Here in this case I expect to create duplicate relationship, but in
    big picture I should always check the current relations before calling
    addToX ?

    With regards
    Marcin

    On 19/01/2008, at 12:43 AM, Andrus Adamchik wrote:

    > I don't understand the reason for the error... Did it happen because
    > source and destination are the same object or something? Otherwise I
    > don't see where the duplicate key is created?
    >
    > Andrus
    >
    >
    > On Jan 17, 2008, at 8:28 AM, Marcin Skladaniec wrote:
    >
    >> Hello
    >>
    >> I have encountered an exception when trying to merge relationships
    >> using this code :
    >>
    >> Artist source;
    >> Artist destination;
    >> while (source.getPaintings().size() > 0) {
    >> Object value = source. getPaintings().get(0);
    >>
    >> source.removeFromPaintings(value);
    >> destination.addToPaintings(value);
    >> }
    >>
    >> This code works for one-to-many relationships, no surprise. For the
    >> many-to-many relationships with intermediate table with compound pk
    >> the result is, that upon commit an error message comes up:
    >>
    >> The statement was aborted because it would have caused a duplicate
    >> key value in a unique or primary key constraint or unique index
    >> identified by 'SQL071114101016080' defined on
    >> 'ARTIST_PAINTING'.java.sql.SQLException: The statement was aborted
    >> because it would have caused a duplicate key value in a unique or
    >> primary key constraint or unique index identified by
    >> 'SQL071114101016080' defined on 'ARTIST_PAINTING'
    >>
    >> It is a perfectly valid error message, and we have avoided it
    >> already, but shouldn't cayenne resolve this internally and prevent
    >> creating double relationship ?
    >>
    >> With regards
    >> Marcin
    >>
    >



    This archive was generated by hypermail 2.0.0 : Fri Jan 18 2008 - 16:46:45 EST