My code below works fine first time through. But when I wish to subsequently add to my collection (the 'n' of the 1->n) I have found that it needs the attribute (Product.distributionChannelName) set to persist correctly.
When I do the original creation & add I do not have to set this field (it is done automatically) why would I have to do it for any subsequent add???? Is there something in my descriptor (see below supporting info) missing to have this field set automatically for subsequent add or do I actually have to do it via code? Cheers Shane -----Original Message----- From: Shane Mingins [mailto:[EMAIL PROTECTED] Sent: Friday, 13 June 2003 12:49 p.m. To: '[EMAIL PROTECTED]' Subject: ODMG API: 1->n [My Example] 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] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
