I can't figure out what I'm doing wrong.
I'm using joined inheritance and have as my base table InventoryItem
with Agent and Contributor as subclasses / tables.
I also have a mapping table called Show2Contributor :
mysql> describe Show2Contributor;
+---------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+-------+
| showId | int(11) unsigned | NO | PRI | | |
| contributorId | int(11) unsigned | NO | PRI | | |
+---------------+------------------+------+-----+---------+-------+
where each Show then has some set of contributors, with each
contributor containing an agent (and a static thing called a RoleCode,
whic is irrelevant).
Now, I have a weird problem. I'm trying to add 3 Contributors to a
Show. 2 already are mapped (one will stay, one will not). Two have
to be created new and added....
To create the first new contributor, we happen toneed to add a new
agent :
2947 TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 16400155 INSERT INTO InventoryItem (uuid,
itemType, name, coId, publicId, damId, ownerId, creationDate,, ...
2948 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 11750977 SELECT LAST_INSERT_ID()
2949 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 10285791 INSERT INTO Agent (id, commonName) VALUES
(?, ?) [params=(int) 194591, (String) Geir Magnusson Jr.]
so there it creates a new Agent by making the InventoryItem first,
getting the autogen ID, and using that to add to the Agent table.
Then it makes a new contributor, using that Agent (id=194591) :
2959 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 14647551 INSERT INTO InventoryItem (uuid,
itemType, name, coId, publicId, damId, ownerId, creationDate, ...
2997 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 1112653 SELECT LAST_INSERT_ID()
2997 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 4592108 INSERT INTO Contributor (id, roleCode,
agentId) VALUES (?, ?, ?) [params=(int) 194592, (int) 109, (int) 194591]
Fine - so we have a new contributor, id = 194592, with the new agent
(id=194591)
Now, remove from the mapping table the Contributor that we don't need :
3094 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 15955745 DELETE FROM Show2Contributor WHERE showId
= ? [params=(int) 13163]
Now create another Contributor (using an agent we already have) :
3096 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 15187341 INSERT INTO InventoryItem (uuid,
itemType, name, coId, publicId, damId, ownerId, creationDate,...
3122 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 9887497 SELECT LAST_INSERT_ID()
3123 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 9788885 INSERT INTO Contributor (id, roleCode,
agentId) VALUES (?, ?, ?) [params=(int) 194593, (int) 109, (int) 194573]
So that's the 2nd new Contributor (id=194593)
To review - two new contributors : 194592 and 194593. The third is an
old, existing one (happens to be 13163)
Now, OpenJPA then updates a lastModDate for each of the three :
3125 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 12844136 UPDATE InventoryItem SET
lastModificationDate = ? WHERE id = ? [params=(Timestamp) 2008-01-02
23:45:48.924, (int) 13163]
3127 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 13915734 UPDATE InventoryItem SET
lastModificationDate = ? WHERE id = ? [params=(Timestamp) 2008-01-02
23:45:48.989, (int) 194591]
3128 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 10653126 UPDATE InventoryItem SET
lastModificationDate = ? WHERE id = ? [params=(Timestamp) 2008-01-02
23:45:48.989, (int) 194592]
And now seems to screw up adding to the Show2Contributor table - it
adds one of them twice (194593), and skips one (194592).
3129 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 8097602 INSERT INTO Show2Contributor (showId,
contributorId) VALUES (?, ?) [params=(int) 13163, (int) 194575]
3131 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 9028526 INSERT INTO Show2Contributor (showId,
contributorId) VALUES (?, ?) [params=(int) 13163, (int) 194593]
3132 pu TRACE [main] openjpa.jdbc.SQL - <t 8736201, conn 6321587>
executing prepstmnt 11857123 INSERT INTO Show2Contributor (showId,
contributorId) VALUES (?, ?) [params=(int) 13163, (int) 194593]
This leads to a contraint violation, and the whole thing rolls back.
Um.
Help? :) This happens for both a 1.1.0-SNAPSHOT as well as 1.0.1
release.
TIA
geir