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