I'm working on a fairly simple sample program (modified from the tutorial1 code shipped with OJB) and I'm running into some unexplainable (by me :-) behavior relating to a 1:N relation.

The relationship is a simple 1:N from a Person object to a Trait object.  I've attached the repository_user.xml and the source code in question.

As attached, the subordinate Trait objects are properly stamped with the OID of the Person object.  However, if I uncomment the "reference-descriptor" in Trait (making it a traversable relation from Trait to Person), the Trait objects are not stamped with the Person object's OID when they are persisted.  I'm sure that I just don't understand the interplay between these conditions, so if anybody can explain it, it would help a lot.

Note, you can ignore all the fields relating to timestamp, lock, lastModified, etc.  They are artifacts put in by AXgen and are irrelevant.

Thanks.
--
signature Larry V. Streepy, Jr.
Senior Vice President and CTO
Health Language, Inc.
<class-descriptor class="com.staffmix.nurse.competencies.TraitImpl"
  table="Trait">
  <field-descriptor autoincrement="true" primarykey="true" column="traOID" jdbc-type="VARCHAR" name="OID"/>
  <field-descriptor column="traLockTimestamp" jdbc-type="TIMESTAMP" name="lockTimestamp"/>
  <field-descriptor column="traLockUser" jdbc-type="VARCHAR" name="lockUser"/>
  <field-descriptor column="traLastModified" jdbc-type="TIMESTAMP" name="lastModified"/>
  <field-descriptor column="traLastModifier" jdbc-type="VARCHAR" name="lastModifier"/>
  <field-descriptor column="traTraitName" jdbc-type="VARCHAR" name="traitName"/>
  <field-descriptor column="traPersonOID" jdbc-type="VARCHAR" name="personOID"/>
    <!--
  <reference-descriptor proxy="true"
    auto-delete="false" auto-retrieve="true" auto-update="false"
    class-ref="com.staffmix.nurse.competencies.PersonImpl"
    name="person">
    <foreignkey field-ref="personOID"/>
  </reference-descriptor>
  -->
</class-descriptor>

<class-descriptor class="com.staffmix.nurse.competencies.CompetencyImpl"
  table="Competency">
  <field-descriptor autoincrement="true" primarykey="true" column="comOID" jdbc-type="VARCHAR" name="OID"/>
  <field-descriptor column="comLockTimestamp" jdbc-type="TIMESTAMP" name="lockTimestamp"/>
  <field-descriptor column="comLockUser" jdbc-type="VARCHAR" name="lockUser"/>
  <field-descriptor column="comLastModified" jdbc-type="TIMESTAMP" name="lastModified"/>
  <field-descriptor column="comLastModifier" jdbc-type="VARCHAR" name="lastModifier"/>
  <field-descriptor column="comName" jdbc-type="VARCHAR" name="name"/>
  <field-descriptor column="comDescription" jdbc-type="VARCHAR" name="description"/>
  <collection-descriptor proxy="true"
    collection-class="org.apache.ojb.broker.util.collections.ManageableVector"
    auto-delete="false" auto-retrieve="true" auto-update="false"
    element-class-ref="com.staffmix.nurse.competencies.PersonImpl"
    indirection-table="CompetencyPerson"
    name="persons"
  >
    <fk-pointing-to-this-class column="competencyOID"/>
    <fk-pointing-to-element-class column="personOID"/>
  </collection-descriptor>
</class-descriptor>

<class-descriptor class="com.staffmix.nurse.competencies.PersonImpl"
  table="Person">
  <field-descriptor autoincrement="true" primarykey="true" column="perOID" jdbc-type="VARCHAR" name="OID"/>
  <field-descriptor column="perLockTimestamp" jdbc-type="TIMESTAMP" name="lockTimestamp"/>
  <field-descriptor column="perLockUser" jdbc-type="VARCHAR" name="lockUser"/>
  <field-descriptor column="perLastModified" jdbc-type="TIMESTAMP" name="lastModified"/>
  <field-descriptor column="perLastModifier" jdbc-type="VARCHAR" name="lastModifier"/>
  <field-descriptor column="perEmpid" jdbc-type="VARCHAR" name="empid"/>
  <field-descriptor column="perName" jdbc-type="VARCHAR" name="name"/>
  <collection-descriptor proxy="true"
    collection-class="org.apache.ojb.broker.util.collections.ManageableVector"
    auto-delete="true" auto-retrieve="true" auto-update="true"
    element-class-ref="com.staffmix.nurse.competencies.TraitImpl"
    orderby="traitName"
    name="traits"
  >
    <inverse-foreignkey field-ref="personOID"/>
  </collection-descriptor>
  <collection-descriptor proxy="true"
    collection-class="org.apache.ojb.broker.util.collections.ManageableVector"
    auto-delete="false" auto-retrieve="true" auto-update="false"
    element-class-ref="com.staffmix.nurse.competencies.CompetencyImpl"
    indirection-table="CompetencyPerson"
    name="competencys"
  >
    <fk-pointing-to-this-class column="personOID"/>
    <fk-pointing-to-element-class column="competencyOID"/>
  </collection-descriptor>
</class-descriptor>

package com.staffmix.nurse.play;

import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerException;
import com.staffmix.nurse.competencies.PersonImpl;
import com.staffmix.nurse.competencies.Trait;
import com.staffmix.nurse.competencies.TraitImpl;

/**
 * Insert the type's description here.
 * Creation date: (04.03.2001 10:34:15)
 * @author Thomas Mahler
 */
public class UCEnterNewPerson extends AbstractUseCase
{
    /**
     * UCEnterNewProduct constructor comment.
     */
    public UCEnterNewPerson(PersistenceBroker broker)
    {
        super(broker);
    }

    /** perform this use case*/
    public void apply()
    {
        // this will be our new object
        PersonImpl newPerson = new PersonImpl();
        // now read in all relevant information and fill the new object:
        System.out.println("please enter a new person");
        String in = readLineWithMessage("enter name:");
        newPerson.setName(in);
        in = readLineWithMessage("enter empid:");
        newPerson.setEmpid(in);

        // now perform persistence operations
        try
        {
            // 1. open transaction
            broker.beginTransaction();

            while( (in = readLineWithMessage("Enter trait:")) != null ) {
                String traitName = in.trim();
                if( traitName.length() == 0 )
                    break;
                TraitImpl trait = new TraitImpl();
                trait.setTraitName( traitName );
                newPerson.addTrait( trait );
            }

            // 2. make the new object persistent
            broker.store(newPerson);
            broker.commitTransaction();
        }
        catch (PersistenceBrokerException ex)
        {
            // if something went wrong: rollback
            broker.abortTransaction();
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
    }

    /** get descriptive information on use case*/
    public String getDescription()
    {
        return "Enter a new person";
    }
}

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

Reply via email to