hi jason,

i made some test wit references:

Person has a reference to Test. first i connect the Test from person1 to person2, then i add a new Test to person2.
this works when i set auto-update="true" in the reference-descriptor !


   private void updateRef(PersistenceBroker broker)
   {
       Query query;
       Criteria crit;
       IPerson person1, person2;
       ITest testObj = null;

       crit = new Criteria();
       crit.addEqualTo("id", new Integer(1));
       query = new QueryByCriteria(Person.class, crit);
       person1 = (IPerson) broker.getObjectByQuery(query);
       testObj = person1.getTestObject();

       crit = new Criteria();
       crit.addEqualTo("id", new Integer(3));
       query = new QueryByCriteria(Person.class, crit);
       person2 = (IPerson) broker.getObjectByQuery(query);

       // connect existing TestObj of person1
       person2.setTestObject(testObj);
       broker.store(person2);
       broker.clearCache();

       crit = new Criteria();
       crit.addEqualTo("id", new Integer(3));
       query = new QueryByCriteria(Person.class, crit);
       person2 = (IPerson) broker.getObjectByQuery(query);

testObj = person2.getTestObject();
// connect to a new TestObj
Test testObj1 = new Test();
testObj1.setId(new Integer(77));
testObj1.setTest("New TestObj 77");
person2.setTestObject(testObj1);
broker.store(person2);


-----

  <class-descriptor
     class="brj.ojb.Person"
     table="tabPerson"
  >
...
      <field-descriptor
        name="idTest"
        column="idTest"
        jdbc-type="INTEGER"
     />
....
     <reference-descriptor
        name="testObject"
        class-ref="brj.ojb.Test"
        proxy="false"
        auto-update="true"
        >
        <foreignkey field-ref="idTest"/>
     </reference-descriptor>
....

 <class-descriptor
     class="brj.ojb.Test"
     table="tabTest"
   >
     <field-descriptor id="1"
        name="id"
        column="id"
        jdbc-type="INTEGER"
        primarykey="true"
        autoincrement="true"
     />
     <field-descriptor id="2"
        name="test"
        column="test"
        jdbc-type="VARCHAR"
     />

</class-descriptor>

hth
jakob

Jason McKerr wrote:

OK, I've done some more testing. Basically I'm finding that

a) If the foreign key datatype is a primitive (int) it works fine, but
you can't null it

OR

b) If it's not a primitive, the reference (reference-descriptor) object
MUST exist and be set for the foreign-key to persist.  That means I have
two choices:

1) Switch to primitives
2) do runtime checks. As in, if (fkID != null) {
Object a = new Object();
a.setPK(fkID);
}
broker.store(this);


Included is the Java file (attached) and the snippet from my
repository.xml.

Thanks,

Jason

----------------Snippet----------------------------------



<!-- Definitions for org.nacse.nees.data.project.Acknowledgement -->
 <class-descriptor class="org.nacse.nees.data.project.Acknowledgement"
table="ACKNOWLEDGEMENT">
   <field-descriptor name="ackID" column="ACKID" jdbc-type="INTEGER"
primarykey="true" autoincrement="true" sequence-name="ackSeq"/>
   <field-descriptor name="projectID" column="PROJECTID"
jdbc-type="INTEGER"
conversion="org.apache.ojb.broker.accesslayer.conversions.Int2IntegerFieldConversion"/>
   <field-descriptor name="acknowledgements" column="ACKNOWLEDGEMENTS"
jdbc-type="VARCHAR"/>
   <field-descriptor name="sponsors" column="SPONSORS"
jdbc-type="VARCHAR"/>
   <field-descriptor name="ackOptLock" column="ACKOPTLOCK"
jdbc-type="INTEGER" locking="true"/>
   <reference-descriptor
     name="projectRef"
     class-ref="org.nacse.nees.data.project.Project"
     auto-retrieve="false"
     auto-update="false"
     auto-delete="false">
     <foreignkey field-ref="projectID"/>
   </reference-descriptor>
 </class-descriptor>













On Wed, 2003-06-25 at 10:11, Jakob Braeuchi wrote:


hi jason,

i'd prefer the wrappers. primitives are bad.
could you please provide your class and repository.

jakob

Jason McKerr wrote:



OK, looking at the repository.dtd file, it seems that reference
descriptors cannot be a wrapper datatype (Integer).  It must be
primitive.  Does that mean I can't have a nullable foreign key? I know
that's unusual, but it's not that unusual.

Switching to an int made it work, but now it's required.  Is there a way
around this? Using a conversion?

Jason


On Wed, 2003-06-25 at 09:20, Jason McKerr wrote:





Hey guys,

I'm having a problem with a nullable foreign-key column not getting
updated.

I've got a table (Acknowledgements) that has a foreign key to the
Project table.


Now if I have all of the columns set for acknowledgements (including
projectID) all of the columns except projectID are getting set when I
call store().  The projectID is getting set to null.

If I comment out the reference call to Project from the Acknowledgement
table in my repository, the column gets set normally.

So the question is: Can I not just do an insert without a complete
object reference?  I'm doing a lot of this over serialized XML so it's
not cool to have to pass an object graph just to do an isnert on a minor
related table.

Jason




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




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






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


------------------------------------------------------------------------

package org.nacse.nees.data.project ;

import org.apache.ojb.broker.query.Query;
import org.apache.ojb.broker.query.QueryByCriteria;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.log4j.Logger;
import org.nacse.nees.data.DataObjectPBroker;

import java.util.Collection;
import java.io.Serializable;

public class Acknowledgement extends DataObjectPBroker implements Serializable {

 private Integer ackID;
 private Integer projectID;
 private String acknowledgements;
 private String sponsors;
 private Project projectRef;
 private Integer ackOptLock;

static Logger log = Logger.getLogger(Acknowledgement.class);

 public Acknowledgement() {
 }
 public Acknowledgement(Integer ackID,
                        Integer projectID,
                        String acknowledgements,
                        String sponsors) {
   this.ackID = ackID;
   this.projectID = projectID;
   this.acknowledgements = acknowledgements;
   this.sponsors = sponsors;
 }

 public Integer getAckID() {
   return ackID;
 }
 public void setAckID(Integer ackID) {
   this.ackID = ackID;
 }
 public Integer getProjectID() {
   return projectID;
 }
 public void setProjectID(Integer projectID) {
   this.projectID = projectID;
 }
 public String getAcknowledgements() {
   return acknowledgements;
 }
 public void setAcknowledgements(String acknowledgements) {
   this.acknowledgements = acknowledgements;
 }
 public String getSponsors() {
   return sponsors;
 }
 public void setSponsors(String sponsors) {
   this.sponsors = sponsors;
 }
 public Project getProjectRef() {
   return projectRef;
 }
 public void setProjectRef(Project projectRef) {
   this.projectRef = projectRef;
 }
 public Integer getAckOptLock() {
   return ackOptLock;
 }
 public void setAckOptLock(Integer ackOptLock) {
   this.ackOptLock = ackOptLock;
 }

 public Collection listAllAcks() throws Exception {
   Query query = new QueryByCriteria(Acknowledgement.class, null);
   PersistenceBroker broker = super.getDefaultBroker();
   try {
     return broker.getCollectionByQuery(query);
   }
   catch (Exception e) {
     log.error("Exception in listAllAcks(): ", e);
     throw new Exception("Exception in listAllAcks(): ", e);
   }
   finally {
     broker.close();
   }
 }

 public void addAck() throws Exception {
   PersistenceBroker broker = super.getDefaultBroker();
   try {
     broker.beginTransaction();
     broker.store(this);
     broker.commitTransaction();
   }
   catch (Exception e) {
     broker.abortTransaction();
     log.error("Exception in addAck(): ", e);
     throw new Exception("Exception in addAck(): ", e);
   }
   finally {
     broker.close();
   }
 }

 public Acknowledgement selectAck() throws Exception {
   Query query = new QueryByCriteria(this);
   PersistenceBroker broker = super.getDefaultBroker();
   try {
     Acknowledgement ack = (Acknowledgement)broker.getObjectByQuery(query);
     return ack;
   }
   catch (Exception e) {
     log.error("Exception in selectAck(): ", e);
     throw new Exception("Exception in selectAck(): ", e);
   }
   finally {
     broker.close();
   }
 }

 public void editAck() throws Exception {
   PersistenceBroker broker = super.getDefaultBroker();
   try {
     broker.beginTransaction();
     broker.store(this);
     broker.commitTransaction();
   }
   catch (Exception e) {
     broker.abortTransaction();
     log.error("Exception in editAck(): ", e);
     throw new Exception("Exception in editAck(): ", e);
   }
   finally {
     broker.close();
   }
 }

 public void removeAck() throws Exception {
   PersistenceBroker broker = super.getDefaultBroker();
   try {
     broker.beginTransaction();
     broker.delete(this);
     broker.commitTransaction();
   }
   catch (Exception e) {
     broker.abortTransaction();
     log.error("Exception in removeAck(): ", e);
     throw new Exception("Exception in removeAck(): ", e);
   }
   finally {
     broker.close();
   }
 }
}




------------------------------------------------------------------------

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



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



Reply via email to