You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Alexandre BOISSEAU <al...@ifsic.univ-rennes1.fr> on 2004/06/22 10:47:10 UTC

Creates a new Object but this object already existing.

Hi,

I have spent two days on the following problem: let a class A having an 
object attribute bObj of class B. When I make an object aObj of class A 
persistent and modify it, but without mofifying the bObj attribute, then 
OJB tries to insert bObj into the database. As bObj already exists, JDO 
fails.

Any idea on this ?

Below a full explanation of my problem.

Regards,

AB




I have a CTicket class with several attributes, including an object 
attribute of CDepartment type.

First, I create and make persistent a CTicket instance. It's ok, I have 
no problem.
The attribute of type CDepartment is already persistant (and previously 
stored in the DB).

Next, I make changes on this CTicket instance (but I don't modify the 
attribute of CDepartment type). When I commit, the CTicket is dirty 
(normal!) and the PersistenceBroker makes the update.
The CTicket is normally updated in the DB.
But after this update, the OjbStoreManager tries to flush the attribute 
of type CDepartment. And, of course, the insert procedure failed because 
this objet is already existing.

To correct this problem, I tried to add the "auto-update=none" tag for 
this attribute in my repository file.

Here is the corresponding log:
      [JDO] DEBUG: OjbStoreManager.flush: 
org.esupportail.portal.channels.CHelpdesk.CTicket{214}, P_DIRTY
      [JDO] DEBUG: OjbStoreManager.update
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] DEBUG: 
getObjectByIdentity org.esupportail.portal.channels.CHelpdesk.CTicket{214}
      [org.apache.ojb.broker.accesslayer.StatementManager] DEBUG: 
closeResources was called
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] DEBUG: 
getObjectByIdentity 
org.esupportail.portal.channels.CHelpdesk.CUser{24007583}
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] DEBUG: 
getObjectByIdentity 
org.esupportail.portal.channels.CHelpdesk.CUser{24007583}
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] DEBUG: 
getObjectByIdentity org.esupportail.portal.channels.CHelpdesk.CDepartment{1}
      [JDO] DEBUG: OjbStoreConnector.flush: connectionReadyForRelease=false
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] INFO: Cascade 
store for this reference-descriptor (owner) was set to false.
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] INFO: Cascade 
store for this reference-descriptor (manager) was set to false.
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] INFO: Cascade 
store for this reference-descriptor (department) was set to false.
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] INFO: Cascade 
store for this reference-descriptor (connectionTicket) was set to false.
      [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] DEBUG: 
executeUpdate :
      <ticket>
      <id>214</id>
      [...]
      </ticket>
      [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] DEBUG: 
executeUpdate: com.mysql.jdbc.PreparedStatement@39f16f: UPDATE ticket 
SET 
owner_id='24007583',manager_id='24007583',department_id=1,origin=1,status=1,priority=-1,scope=1,label='2eme 
ticket',computer='i259p45',creation_date='2004-06-21 
08:55:44',last_action_date='2004-06-22 09:00:34',ascii_history='Label: 
2eme ticket\nComputer: m\'en fous\n\nC\'est mon 2eme 
ti.\n\n\ndgggggggggggggg\n\n\n',connection_ticket_id=null WHERE id = 214
      [org.apache.ojb.broker.accesslayer.StatementManager] DEBUG: 
closeResources was called
      [JDO] DEBUG: OjbStoreManager.flush: 
org.esupportail.portal.channels.CHelpdesk.CDepartment{1}, P_NEW
      [JDO] DEBUG: OjbStoreManager.insert
      [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] DEBUG: 
executeInsert :
      <department>
       [...]
      </department>
      [org.apache.ojb.broker.accesslayer.JdbcAccessImpl] DEBUG: 
executeInsert: com.mysql.jdbc.PreparedStatement@19d688: INSERT INTO 
department (id,label,xlabel,custom_classname,url,auto_expire,visible) 
VALUES (1,'IFSIC','Institut de Formation Supérieur en Informatique et 
Communication.','none','http://www.ifsic.univ-rennes1.fr',5,'1')
      [org.apache.ojb.broker.accesslayer.StatementManager] DEBUG: 
closeResources was called
      [JDO] DEBUG: OjbStoreConnector.rollback
      [org.apache.ojb.broker.accesslayer.ConnectionManagerImpl] INFO: 
Rollback was called, do rollback on current connection 
com.mysql.jdbc.Connection@f2da21
      [org.apache.ojb.broker.core.PersistenceBrokerImpl] DEBUG: PB.close 
was called: org.apache.ojb.broker.core.PersistenceBrokerImpl@19d96b1
      org.apache.ojb.jdori.sql.OjbStoreFatalInternalException: 
org.apache.ojb.jdori.sql.OjbStoreManager.insert
      NestedThrowables:
      org.apache.ojb.broker.PersistenceBrokerSQLException: SQL failure 
while insert object data for class 
org.esupportail.portal.channels.CHelpdesk.CDepartment, PK of the given 
object is [ id=1], object was
      <department>
       [...]
      </department>, exception message is [Invalid argument value,  
message from server: "Duplicata du champ '1' pour la clef 1"]
      at 
org.apache.ojb.jdori.sql.OjbStoreManager.insert(OjbStoreManager.java:101)
      at com.sun.jdori.common.state.PersistentNew.flush(Unknown Source)
      at com.sun.jdori.common.state.StateManagerImpl.flush(Unknown Source)
      at 
org.apache.ojb.jdori.sql.OjbStoreManager.flush(OjbStoreManager.java:304)
      at com.sun.jdori.common.CacheManagerImpl.flushInstances(Unknown 
Source)
      at 
com.sun.jdori.common.PersistenceManagerImpl.flushInstances(Unknown Source)
      at com.sun.jdori.common.TransactionImpl.flushInstances(Unknown Source)
      at com.sun.jdori.common.TransactionImpl.prepareFlush(Unknown Source)
      at com.sun.jdori.common.TransactionImpl.commit(Unknown Source)
      at 
org.esupportail.portal.channels.CHelpdesk.CTicket.addNewAction(CTicket.java:570)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transitionTakeTicket(CHelpdeskChannel.java:1009)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transitionControlPanel(CHelpdeskChannel.java:493)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transitionAuthenticated(CHelpdeskChannel.java:374)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transition(CHelpdeskChannel.java:321)
      at 
org.esupportail.portal.channels.CJDOChannel.setRuntimeData(CJDOChannel.java:404)
      at 
org.jasig.portal.ChannelRenderer$Worker.run(ChannelRenderer.java:412)
      at org.jasig.portal.utils.threading.Worker.run(Worker.java:88)
      Caused by: org.apache.ojb.broker.PersistenceBrokerSQLException: 
SQL failure while insert object data for class 
org.esupportail.portal.channels.CHelpdesk.CDepartment, PK of the given 
object is [ id=1], object was
      <department>
       [...]
      </department>, exception message is [Invalid argument value,  
message from server: "Duplicata du champ '1' pour la clef 1"]
      at 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:242)
      at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBrokerImpl.java:1620)
      at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:1537)
      at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:1493)
      at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:180)
      at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:180)
      at 
org.apache.ojb.jdori.sql.OjbStoreManager.insert(OjbStoreManager.java:97)
      ... 16 more
      Caused by: java.sql.SQLException: Invalid argument value,  message 
from server: "Duplicata du champ '1' pour la clef 1"
      at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1876)
      at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1098)
      at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1192)
      at com.mysql.jdbc.Connection.execSQL(Connection.java:2051)
      at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1680)
      at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1527)
      at 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:197)
      ... 22 more
      NestedThrowablesStackTrace:
      org.apache.ojb.broker.PersistenceBrokerSQLException: SQL failure 
while insert object data for class 
org.esupportail.portal.channels.CHelpdesk.CDepartment, PK of the given 
object is [ id=1], object was
      <department>
       [...]
      </department>, exception message is [Invalid argument value,  
message from server: "Duplicata du champ '1' pour la clef 1"]
      at 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:242)
      at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBrokerImpl.java:1620)
      at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:1537)
      at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:1493)
      at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:180)
      at 
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:180)
      at 
org.apache.ojb.jdori.sql.OjbStoreManager.insert(OjbStoreManager.java:97)
      at com.sun.jdori.common.state.PersistentNew.flush(Unknown Source)
      at com.sun.jdori.common.state.StateManagerImpl.flush(Unknown Source)
      at 
org.apache.ojb.jdori.sql.OjbStoreManager.flush(OjbStoreManager.java:304)
      at com.sun.jdori.common.CacheManagerImpl.flushInstances(Unknown 
Source)
      at 
com.sun.jdori.common.PersistenceManagerImpl.flushInstances(Unknown Source)
      at com.sun.jdori.common.TransactionImpl.flushInstances(Unknown Source)
      at com.sun.jdori.common.TransactionImpl.prepareFlush(Unknown Source)
      at com.sun.jdori.common.TransactionImpl.commit(Unknown Source)
      at 
org.esupportail.portal.channels.CHelpdesk.CTicket.addNewAction(CTicket.java:570)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transitionTakeTicket(CHelpdeskChannel.java:1009)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transitionControlPanel(CHelpdeskChannel.java:493)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transitionAuthenticated(CHelpdeskChannel.java:374)
      at 
org.esupportail.portal.channels.CHelpdesk.CHelpdeskChannel.transition(CHelpdeskChannel.java:321)
      at 
org.esupportail.portal.channels.CJDOChannel.setRuntimeData(CJDOChannel.java:404)
      at 
org.jasig.portal.ChannelRenderer$Worker.run(ChannelRenderer.java:412)
      at org.jasig.portal.utils.threading.Worker.run(Worker.java:88)
      Caused by: java.sql.SQLException: Invalid argument value,  message 
from server: "Duplicata du champ '1' pour la clef 1"
      at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1876)
      at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1098)
      at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1192)
      at com.mysql.jdbc.Connection.execSQL(Connection.java:2051)
      at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1680)
      at 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1527)
      at 
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:197)
      ... 22 more



-- 
Alexandre BOISSEAU
Université de Rennes1


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org