Hi All 

Having struggled with using a collection to hold a 1->n relationship using
the ODMG API I have come up with the following basic code (to be refactored
later).  

I would appreciate any comments (especially as I would not want others to
use it if I have made errors).

Below the code is the database mappings, classes etc for absolute
transparency.

Cheers
Shane

public static void main(String[] args)
{
        Implementation odmg = OJB.getInstance();
        Database db = odmg.newDatabase();
        try
        {
                db.open("default", Database.OPEN_READ_WRITE);
        }
        catch (ODMGException e)
        {
                e.printStackTrace();
        }

        // Create a new Distribution Channel with two products
        DistributionChannel dc = new DistributionChannel("New
Channel","Swiss Bank A/c");
        dc.addProduct(new Product("P1","Product One"));
        dc.addProduct(new Product("P2","Product Two"));

        Transaction tx = odmg.newTransaction();
        tx.begin();
        db.makePersistent(dc);
        tx.commit();


        //  Update channel and products
        tx.begin();
        OQLQuery query = odmg.newOQLQuery();
        String oql = "select all from " +
DistributionChannel.class.getName() + " where name = $1";
        DList results = null;
        try
        {
                query.create(oql);
                query.bind("New Channel");
                results = (DList)query.execute();
        }
        catch (QueryException e)
        {
                e.printStackTrace();
        }
        DistributionChannel channel  = (DistributionChannel)results.get(0);

        // Changing attributes to the Distribution Channel or existing
products is okay
        channel.setCmaBankAccount("Name Changed");
        channel.getProduct("P2").setDescription("Desc Changed");

        // Add a new product to the collection and persist it to the
database
        Product pNew = new Product("P3","Product Three Added");
        channel.addProduct(pNew);
        db.makePersistent(pNew);

        // Delete a product from the collection and database
        Product pDel = channel.getProduct("P1");
        channel.removeProduct(pDel);
        db.deletePersistent(pDel);

        // Persist changes to Distribution Channel to database
        db.makePersistent(channel);
        tx.commit();
}

<<-- BELOW IS THE SUPPORTING INFORMATION ->>

The model is like this:

---------------------------                    ---------------
|  DistributionChannel    |                    |  Product    |
---------------------------                    ---------------
| name                    |  <---------------- | name        |
| cmabankAccount          |                    | description |
| products                |                    |             |
---------------------------                    ---------------

The mappings are like such:

<class-descriptor class="com.assureinternational.ims.model.Product"
table="product">
   <field-descriptor name="name" column="name" jdbc-type="VARCHAR"
primarykey="true" />
   <field-descriptor name="distributionChannelName" column="distchannelname"
jdbc-type="VARCHAR" primarykey="true" />
   <field-descriptor name="description" column="description"
jdbc-type="VARCHAR"/>
</class-descriptor>

<class-descriptor
class="com.assureinternational.ims.model.DistributionChannel"
table="distributionchannel">
   <field-descriptor name="name" column="name" jdbc-type="VARCHAR"
primarykey="true"/>
   <field-descriptor name="cmaBankAccount" column="cmabankaccount"
jdbc-type="VARCHAR"/>
   <collection-descriptor name="products"
element-class-ref="com.assureinternational.ims.model.Product" >
      <inverse-foreignkey field-ref="distributionChannelName"/>
    </collection-descriptor>
</class-descriptor>

The classes are like this:

package com.assureinternational.ims.model;

import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

public class DistributionChannel
{
    private String name;
    private String cmaBankAccount;
    private Collection products = new Vector();

    public DistributionChannel()
    {
    }

    public DistributionChannel(String name, String cmaBankAccount)
    {
        this.name = name;
        this.cmaBankAccount = cmaBankAccount;
    }

    public String getName()
    {
        return name;
    }

    public String getCmaBankAccount()
    {
        return cmaBankAccount;
    }

    public void setCmaBankAccount(String cmaBankAccount)
    {
        this.cmaBankAccount = cmaBankAccount;
    }

    public void addProduct(Product product)
    {
        this.products.add(product);
    }

    public Product getProduct(String name)
    {
        for (Iterator iterator = products.iterator(); iterator.hasNext();)
        {
            Product product = (Product) iterator.next();
            if (product.getName().equals(name))
                return product;
        }
        return null;
    }

    public void removeProduct(Product product)
    {
        this.products.remove(product);
    }
}


package com.assureinternational.ims.model;

public class Product
{
    private String distributionChannelName; // OJB
    private String name;
    private String description;

    public Product()
    {
    }

    public Product(String name, String description)
    {
        this.name = name;
        this.description = description;
    }

    public String getName()
    {
        return name;
    }

    public String getDescription()
    {
        return description;
    }

    public void setDescription(String description)
    {
        this.description = description;
    }
}


    
Shane Mingins
Analyst Programmer
Assure NZ Ltd
Ph 644 494 2522



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

Reply via email to