Hi.

I've recently updated from OJB 1.0.3 to 1.0.4 and I'm having with the
ODMG API. What worked in 1.0.3 now doesn't. It seems to be a change in
the states classes, but I'm not sure. In short, the problem could be
explained with a simple example.

We have two classes A and B, related 0:N. If I create one object of each
class and then delete them, OJB tries to insert B object which result in
a SQL error: foreing key constraint.

Here is some code to show you:

repository_user.xml
--------------------------------
<class-descriptor class="pruojb.A" table="A">
  <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" />
  <field-descriptor name="nombre" column="NOMBRE" jdbc-type="VARCHAR" />
  <collection-descriptor name="items" element-class-ref="pruojb.B"
    auto-retrieve="true" auto-update="false" auto-delete="false">
    <inverse-foreignkey field-ref="id"/>
  </collection-descriptor>
</class-descriptor>

<class-descriptor class="pruojb.B" table="B">
  <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" />
  <field-descriptor name="descrip" column="DESCRIP" jdbc-type="VARCHAR" />
  <field-descriptor name="percent" column="PERCENT" jdbc-type="DOUBLE" />
</class-descriptor>

Test class: Main.java
--------------------------------
package pruojb;

import org.apache.ojb.odmg.OJB;
import org.odmg.Database;
import org.odmg.Implementation;
import org.odmg.ODMGException;
import org.odmg.Transaction;

public class Main {
  public static void main(String[] args) {
   
    Implementation ojb = (Implementation) OJB.getInstance();
    Database db = ojb.newDatabase();
    try {
      db.open("default#MED#med", Database.OPEN_READ_WRITE);
     
      Transaction tx = ojb.newTransaction();
      tx.begin();
     
      // Create A and B objects and make persistent
      A a = new A();
      a.setId(10);
      a.setNombre("Ten");
      tx.lock(a, Transaction.WRITE);
      B b = new B();
      b.setId(a.getId());
      b.setDescrip("Detail");
      b.setPercent(80.5);
      a.getItems().add(b);
      tx.lock(b, Transaction.WRITE);
     
      // Delete A and B
      db.deletePersistent(a);
      db.deletePersistent(b);
     
      tx.commit();
     
      db.close();
    } catch (ODMGException ex) {
      ex.printStackTrace();
    }
 
  }
 
}


A.java
-----------------------------
package pruojb;

import java.util.ArrayList;
import java.util.List;

public class A {
  private int id;
  private String nombre;
  private List items;
 
  public A() {
    items = new ArrayList();
  }

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }

  public String getNombre() {
    return nombre;
  }
  public void setNombre(String nombre) {
    this.nombre = nombre;
  }

  public List getItems() {
    return items;
  }
  public void setItems(List items) {
    this.items = items;
  }
}


B.java
---------------------------------------
package pruojb;

public class B {
  private int id;
  private String descrip;
  private double percent;
 
  public B() {
  }

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }

  public String getDescrip() {
    return descrip;
  }
  public void setDescrip(String descrip) {
    this.descrip = descrip;
  }

  public double getPercent() {
    return percent;
  }
  public void setPercent(double percent) {
    this.percent = percent;
  }
}


Part of the output when using 1.0.4:
* SQLException during execution of sql-statement:
* sql statement was 'INSERT INTO B (ID,DESCRIP,PERCENT) VALUES (?,?,?) '
* Exception message is [GDS Exception. 335544466. violation of FOREIGN
KEY constraint "FK_B_1" on table "B"]
* Vendor error code [335544466]
* SQL state code [HY000]
* Target class is 'pruojb.B'
* PK of the target object is [id=10]
* Source object: [EMAIL PROTECTED]
* The root stack trace is -->
* org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544466.
violation of FOREIGN KEY constraint "FK_B_1" on table "B"
        at
org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:503)
org.apache.ojb.broker.PersistenceBrokerSQLException:
* SQLException during execution of sql-statement:
* sql statement was 'INSERT INTO B (ID,DESCRIP,PERCENT) VALUES (?,?,?) '
* Exception message is [GDS Exception. 335544466. violation of FOREIGN
KEY constraint "FK_B_1" on table "B"]
* Vendor error code [335544466]
* SQL state code [HY000]
* Target class is 'pruojb.B'
* PK of the target object is [id=10]
* Source object: [EMAIL PROTECTED]
        at
org.apache.ojb.broker.util.ExceptionHelper.generateException(ExceptionHelper.java:256)
        at
org.apache.ojb.broker.util.ExceptionHelper.generateException(ExceptionHelper.java:90)
        at
org.apache.ojb.broker.util.ExceptionHelper.generateException(ExceptionHelper.java:71)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:230)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBrokerImpl.java:1891)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:879)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:158)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:158)
        at
org.apache.ojb.odmg.ObjectEnvelope.doInsert(ObjectEnvelope.java:644)
        at
org.apache.ojb.odmg.states.StateNewDirty.commit(StateNewDirty.java:106)
        at
org.apache.ojb.odmg.ObjectEnvelopeTable.writeAllEnvelopes(ObjectEnvelopeTable.java:241)
        at
org.apache.ojb.odmg.ObjectEnvelopeTable.writeObjects(ObjectEnvelopeTable.java:178)
        at
org.apache.ojb.odmg.TransactionImpl.doWriteObjects(TransactionImpl.java:403)
        at
org.apache.ojb.odmg.TransactionImpl.prepareCommit(TransactionImpl.java:762)
        at
org.apache.ojb.odmg.TransactionImpl.commit(TransactionImpl.java:698)
        at pruojb.Main.main(Main.java:36)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception.
335544466. violation of FOREIGN KEY constraint "FK_B_1" on table "B"
        at
org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:503)
        at
org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:144)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:211)
        ... 12 more
        at
org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:144)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:211)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBrokerImpl.java:1891)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:879)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:158)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:158)
        at
org.apache.ojb.odmg.ObjectEnvelope.doInsert(ObjectEnvelope.java:644)
        at
org.apache.ojb.odmg.states.StateNewDirty.commit(StateNewDirty.java:106)
        at
org.apache.ojb.odmg.ObjectEnvelopeTable.writeAllEnvelopes(ObjectEnvelopeTable.java:241)
        at
org.apache.ojb.odmg.ObjectEnvelopeTable.writeObjects(ObjectEnvelopeTable.java:178)
        at
org.apache.ojb.odmg.TransactionImpl.doWriteObjects(TransactionImpl.java:403)
        at
org.apache.ojb.odmg.TransactionImpl.prepareCommit(TransactionImpl.java:762)
        at
org.apache.ojb.odmg.TransactionImpl.commit(TransactionImpl.java:698)
        at pruojb.Main.main(Main.java:36)
at org.firebirdsql.gds.GDSException: violation of FOREIGN KEY constraint
"FK_B_1" on table "B"
        at
org.firebirdsql.jgds.GDS_Impl.readStatusVector(GDS_Impl.java:1816)
        at org.firebirdsql.jgds.GDS_Impl.receiveResponse(GDS_Impl.java:1769)
        at
org.firebirdsql.jgds.GDS_Impl.isc_dsql_execute2(GDS_Impl.java:917)
        at
org.firebirdsql.jca.FBManagedConnection.executeStatement(FBManagedConnection.java:793)
        at
org.firebirdsql.jdbc.AbstractConnection.executeStatement(AbstractConnection.java:946)
        at
org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:499)
        at
org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:144)
        at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeInsert(JdbcAccessImpl.java:211)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBrokerImpl.java:1891)
        at
org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl.java:879)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:158)
        at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersistenceBroker.java:158)
        at
org.apache.ojb.odmg.ObjectEnvelope.doInsert(ObjectEnvelope.java:644)
        at
org.apache.ojb.odmg.states.StateNewDirty.commit(StateNewDirty.java:106)
        at
org.apache.ojb.odmg.ObjectEnvelopeTable.writeAllEnvelopes(ObjectEnvelopeTable.java:241)
        at
org.apache.ojb.odmg.ObjectEnvelopeTable.writeObjects(ObjectEnvelopeTable.java:178)
        at
org.apache.ojb.odmg.TransactionImpl.doWriteObjects(TransactionImpl.java:403)
        at
org.apache.ojb.odmg.TransactionImpl.prepareCommit(TransactionImpl.java:762)
        at
org.apache.ojb.odmg.TransactionImpl.commit(TransactionImpl.java:698)
        at pruojb.Main.main(Main.java:36)



I hope someone can help me. Thank you in advance.

-- 
José María López Lagunas
Visual Limes, S.L.
Plaza Estación 4 bajo izq.
46183 L'Eliana (Valencia) España

Email: [EMAIL PROTECTED]
Tfno. Móvil: +34 607332927
Tfno. Oficina: +34 962750054
Fax: +34 961656697


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to