Hi there,
I would be grateful if someone could take the time to look at this and tell
me what I am doing incorrectly. I have an object A which contains a List of
B objects. Each B object also contains the object A which owns it.
I am trying to persist A via ODMG (and by persisting A I also want all the
B's to be persisted).

I get an error like this:
[org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDefaultImpl]
ERROR: while set field: 
object class[ dk.pk.data.B
target field: a
target field type: class dk.pk.data.A
object value class: java.lang.Integer
object value: 259]
[org.apache.ojb.odmg.TransactionImpl] ERROR: Locking obj
dk.pk.data.A[id=259] with lock mode 4 failed
Error setting field:a in object:dk.pk.data.B: field type mismatch
java.lang.IllegalArgumentException: field type mismatch


Here is my repository xml for A and B:

<class-descriptor class="dk.pk.data.A" table="A_TABLE">
  <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" autoincrement="true"/>
  <collection-descriptor name="bList" element-class-ref="dk.pk.data.B">
    <inverse-foreignkey field-ref="a"/>
  </collection-descriptor>
</class-descriptor>

<class-descriptor class="dk.pk.data.B" table="B_TABLE">
  <field-descriptor name="id" column="ID" jdbc-type="INTEGER"
primarykey="true" autoincrement="true"/>
  <field-descriptor name="a" column="A_ID" jdbc-type="INTEGER"
conversion="dk.pk.data.IdConversion"/>
  <reference-descriptor name="a" class-ref="dk.pk.data.A">
    <foreignkey field-ref="a"/>
  </reference-descriptor>
</class-descriptor>


Here are my A and B and IdConversion classes:

public class A{
  private Integer id;
  private List bList;
  public List getBList(){
    return bList;
  }
  public Integer getId(){
    return id;
  }
  public void setBList( List bList ){
    this.bList = bList;
  }
  public void setId( Integer id ){
    this.id = id;
  }
}

public class B{
  private Integer id;
  private A a;
  public A getA(){
    return a;
  }
  public Integer getId(){
    return id;
  }
  public void setA( A a ){
    this.a = a;
  }
  public void setId( Integer id ){
    this.id = id;
  }
}

public class IdConversion implements FieldConversion{
  public Object javaToSql( Object source ) throws ConversionException{
    return ((A) source ).getId();
  }
  public Object sqlToJava( Object source ) throws ConversionException{
    A a = new A();
    a.setId((Integer)source);
    return a;
  }
}

Here is the code which I am trying to run:

    A a = new A();
    List bList = new ArrayList(5);
    B b1= new B();
    bList.add(b1);
    a.setBList(bList);
    Transaction tx = null;
    tx = odmg.newTransaction();
    tx.begin();
    tx.lock( a, Transaction.WRITE );
    tx.commit();

The two database tables are created like this:

CREATE TABLE A_TABLE(ID INTEGER)
CREATE TABLE B_TABLE(ID INTEGER,A_ID INTEGER)

Thanks,
Peter

Reply via email to