I had to add newItem before the getObjectContext() to allow the program
to compile and then unfortunately I'm getting the error below. There
shouldn't be any duplicate entries as this is the first record I'm
attempting to insert for this particular project and contact. The
underlying project id is 9999 and the contact id is 1922 so I'm not sure
what is generating the duplicate entry.
used by: java.sql.BatchUpdateException: Duplicate entry '2-9999-1922-1'
for key 'U_ProjectContact'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at
com.mysql.jdbc.SQLError.createBatchUpdateException(SQLError.java:1160)
at
com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1773)
at
com.mysql.jdbc.PreparedStatement.executeBatchInternal(PreparedStatement.java:1257)
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:959)
at
org.apache.cayenne.access.jdbc.BatchAction.runAsBatch(BatchAction.java:125)
at
org.apache.cayenne.access.jdbc.BatchAction.performAction(BatchAction.java:90)
at
org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:306)
at
org.apache.cayenne.access.DataDomainFlushAction.runQueries(DataDomainFlushAction.java:234)
at
org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:155)
at
org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:629)
at
org.apache.cayenne.access.DataDomain.onSyncNoFilters(DataDomain.java:598)
at
org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:746)
at
org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:73)
at
org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:70)
at
org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:53)
at
org.apache.cayenne.tx.TransactionFilter.onSync(TransactionFilter.java:70)
at
org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:746)
at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:585)
at
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:744)
... 4 more
Caused by:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Duplicate entry '2-9999-1922-1' for key 'U_ProjectContact'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:934)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2470)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2617)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2550)
at
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
at
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
at
com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1751)
... 22 more
On 03/03/16 11:50 AM, [email protected] wrote:
Change the line that throws the exception --> newItem.setContact(item);
to: newItem.setContact( getObjectContext().localObject( item ) );
-----Original Message----- From: Andrew Willerding
Sent: Thursday, March 3, 2016 4:16 PM
To: [email protected]
Subject: Re: No object is registered in context with Id
Here's the rest of the stack.
2016-03-03,09:05:44:433,ERROR,[Thread-15],,'com.callistacti.vaadinLib.IWindowEditBase'
ERROR:ObservableComponent Error processing observer's update code.
Observer==>class
com.itsurcom.bluecranex.GUI.Panels.PanelProjectContacts::org.apache.cayenne.CayenneRuntimeException:
[v.4.0.M3 Feb 08 2016 17:09:41] No object is registered in context with
Id <ObjectId:Contact, ContactID=1922>
at
org.apache.cayenne.access.ObjectStore.registerDiff(ObjectStore.java:162)
at
org.apache.cayenne.access.ObjectStore.arcCreated(ObjectStore.java:974)
at
org.apache.cayenne.util.ObjectContextGraphAction.handleArcPropertyChange(ObjectContextGraphAction.java:88)
at
org.apache.cayenne.util.ObjectContextGraphAction.handlePropertyChange(ObjectContextGraphAction.java:65)
at
org.apache.cayenne.BaseContext.propertyChanged(BaseContext.java:460)
at
org.apache.cayenne.CayenneDataObject.addToManyTarget(CayenneDataObject.java:248)
at
org.apache.cayenne.CayenneDataObject.setReverseRelationship(CayenneDataObject.java:417)
at
org.apache.cayenne.CayenneDataObject.setToOneTarget(CayenneDataObject.java:372)
at
com.itsurcom.bluecranex.database.auto._ProjectContact.setContact(_ProjectContact.java:44)
The reason I was setting all the objects to use the same ObjectContext
was that the objects themselves are setup in multiple threads and I was
getting ObjectContext errors.
Here is the error I was trying to get around.
2016-03-03,09:12:20:135,ERROR,[Thread-25],,'com.callistacti.vaadinLib.IWindowEditBase'
ERROR:ObservableComponent Error processing observer's update code.
Observer==>class
com.itsurcom.bluecranex.GUI.Panels.PanelProjectContacts::org.apache.cayenne.CayenneRuntimeException:
[v.4.0.M3 Feb 08 2016 17:09:41] Cannot set object as destination of
relationship contact because it is in a different ObjectContext
at
org.apache.cayenne.CayenneDataObject.willConnect(CayenneDataObject.java:399)
at
org.apache.cayenne.CayenneDataObject.setToOneTarget(CayenneDataObject.java:355)
at
com.itsurcom.bluecranex.database.auto._ProjectContact.setContact(_ProjectContact.java:44)
Using this code...
ObjectContext oc = UI.getObjectContext();
int addItemCount = 0;
for (Contact item : list) {
ProjectContact newItem =
oc.newObject(ProjectContact.class);
//project.setObjectContext(oc);
//project.getCompany().setObjectContext(oc);
newItem.setCompany(project.getCompany());
//item.setObjectContext(oc);
exception-->newItem.setContact(item);
newItem.setProject(project);
newItem.setPrimeContact(ProjectContact.Type.NON_PRIME.getCode());
addItemCount++;
}
oc.commitChanges();
On 03/03/16 06:32 AM, Andrus Adamchik wrote:
Hi Andrew,
You don't show the relevant stack, so I can only guess. But I find
the following code suspect:
project.setObjectContext(oc);
project.getCompany().setObjectContext(oc);
Setting ObjectContext explicitly on Persistent objects is never a
good idea. Object should stay in the ObjectContext it was created in
or fetched from). Any specific reason why you are doing that?
Andrus
On Mar 3, 2016, at 6:15 AM, Andrew Willerding
<[email protected]> wrote:
I am stuck on exactly what this message means and how to correct the
situation.
Here are my table relationships.
Project ProjectContact Contact
--------- -------------------- ----------
ProjectID <---> ProjectID
ContactID <---> ContactID
Here is my code.
ObjectContext oc = UI.getObjectContext();
for (Contact item : list) {
ProjectContact newItem =
oc.newObject(ProjectContact.class);
project.setObjectContext(oc);
project.getCompany().setObjectContext(oc);
newItem.setCompany(project.getCompany());
item.setObjectContext(oc);
exception->newItem.setContact(item);
newItem.setProject(project);
newItem.setPrimeContact(ProjectContact.Type.NON_PRIME.getCode());
addItemCount++;
Here's the exception that is thrown when the
newItem.setContact(item) is executed.
2016-03-02,22:00:25:587,ERROR,[Thread-83],,'com.callistacti.vaadinLib.IWindowEditBase'
ERROR:ObservableComponent Error processing observer's update code.
Observer==>class
com.itsurcom.bluecranex.GUI.Panels.PanelProjectContacts::org.apache.cayenne.CayenneRuntimeException:
[v.4.0.M3 Feb 08 2016 17:09:41] No object is registered in context
with Id <ObjectId:Contact, ContactID=1170>