Try this,
For class B: add an attribute to model fk to A.
public class B {
private Integer id;
private A a;
private int fkToA;
...
}
and change class descriptor of B like this:
<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="fkToA" column="A_ID" jdbc-type="INTEGER"
conversion="dk.pk.data.IdConversion"/>
<reference-descriptor name="a" class-ref="dk.pk.data.A">
<foreignkey field-ref="fkToA" />
</reference-descriptor>
</class-descriptor>
Houar
-----Message d'origine-----
De : Peter Kirk [mailto:[EMAIL PROTECTED]
Envoy� : jeudi 13 mars 2003 11:39
� : 'OJB Users List'
Objet : Object containing List of other objects
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
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]