Solution C: assign a meaningless primary key to the join table.

Obviously, this isn't an option for everyone.

On Thu, Feb 17, 2011 at 3:11 AM, Aristedes Maniatis <a...@maniatis.org> wrote:
> On 15/02/11 2:04 PM, Marcin Skladaniec wrote:
>>
>> java.sql.SQLIntegrityConstraintViolationException: 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 'TAGRELATION_UNIQUE'
>> defined on 'TAGRELATION'.
>
>
> Can I summarise, since I think you've highlighted a problem which is
> completely different to your email subject.
>
> 1. Table A has primary key which is user defined (in this case, it is the
> join between two other tables, so the PK is the compound of the two foreign
> keys)
>
> 2. Create record in table A. Commit.
>
> 3. Delete that record in table A.
>
> 4. Create another record in table A with the same PK as the one just deleted
> (since it joins the same other two tables).
>
> 5. Commit -> ERRROR
>
>
> The create in step 4 is being committed to the db before the delete in step
> 3, failing the key constraint.
>
>
> Use case
> --------
> You may wonder why on earth this is happening. Well, in a rich client
> application a user might tick a checkbox to link two records and then untick
> it and tick it again while they make up their mind. All those changes result
> in changes to the context.
>
>
> Solution
> --------
>
> A. Dedupe the overlapping create/delete records in the context before
> committing.
> B. Order the SQL better.
>
>
>
> Any thoughts about how Cayenne could deal with this better? What do other
> ORMs do in this scenario?
>
>
>
> Ari
>
>
> --
> -------------------------->
> Aristedes Maniatis
> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>

Reply via email to