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]

Reply via email to