Hi Ben,

if you create table/class 'Category' with primary key 'categoryid' and reference
'categoryid' by 'product.categoryid' and 'productheader.categoryid' it should be
possible to define a mapping with castor. A OQL similar to

LEFT OUTER JOIN productheader ON  
product.categoryid=productheader.categoryid

should be possible with this solution.

Regards
Ralf


----- Original Message ----- 
From: "Ben Christensen" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, June 10, 2003 9:08 PM
Subject: [castor-dev] Use Different Object Key on Many-Key (Left Outer Join)


> Hi,
> 
> Castor is working wonderfully at loading some fairly complex  
> relationships, however, I've come across something that I don't think  
> Castor can handle without me changing the database structure  
> substantially.
> 
> I have a Product table (structure is found below) whose Key is  
> productid. This Product table (and object) have several objects such as  
> DataSources that are pulled in a collection based upon that productid  
> using the many-key element. This works fine.
> 
> However, I have a situation where there is a referencing table for  
> product headers that uses the Product.categoryid key instead of  
> Product.productid.
> 
> In the SQL statement right here you'll see that using a normal  
> "many-key" approach, it assumes that Product.productid will always be  
> used (LEFT OUTER JOIN productheader ON  
> product.productid=productheader.categoryid)
> 
> SELECT  
> product.description,product.mfgpartno,product.categoryid,product.manufac 
> turerid,productdatasources.productdatasourcesid,productheader.producthea 
> derid FROM product LEFT OUTER JOIN productdatasources ON  
> product.productid=productdatasources.productid LEFT OUTER JOIN  
> productheader ON product.productid=productheader.categoryid WHERE  
> product.productid=?
> 
> What I need it to do is let me change the many-key slightly so the sql  
> becomes:
> 
> LEFT OUTER JOIN productheader ON  
> product.categoryid=productheader.categoryid
> 
> I have not yet determined a way to do this with Castor -- since Castor  
> always seems to do the join with the Object key defined by 'identity'  
> in the class element -- and the many-key element doesn't seem to have  
> any arguments to change that.
> 
> <sql many-key="categoryid">
> 
> I would like to do:
> 
> <sql many-key="categoryid" name="categoryid"> to override what is the  
> default <sql many-key="categoryid" name="productid">
> 
> though I'd call the name element something different in this case, such  
> as many-key-id.
> 
> 
> 
> The reason this is done in the database is because if I were to use the  
> ProductID for the ProductHeader table, instead of CategoryID, the  
> Header table would be exponentially bigger than it needs to be, having  
> duplicate entries for thousand of products, rather that just the  
> several hundred categories that those products fall under. This is a  
> simple scenario using JDBC SQL -- could you shine some light please on  
> how to implement this with Castor.
> 
> I appreciate your advice in advance.
> 
> Ben
> 
> 
> 
> 
> 
> 
> *********  Mapping File for Product, DataSource, and Header objects  
> ************
> 
> Note: I have not included mappings for object that are not important to  
> the question at hand ... such as Category, Manufacturer,  
> AccessoryProducts etc.
> 
> 
> 
> <class name="com.company.beans.content.ProductDTO" identity="id"  
> key-generator="MAX" read-only="true">
>          <cache-type type="count-limited" capacity="500"/>
>          <map-to table="product" />
> 
>          <field name="id" type="integer">
>              <sql name="productid" type="integer" />
>          </field>
> 
>          <field name="description" type="string">
>              <sql name="description" type="char" />
>          </field>
> 
>          <field name="mfgPartNumber" type="string">
>              <sql name="mfgpartno" type="char" />
>          </field>
> 
>          <field name="category"  
> type="com.company.beans.content.CategoryDTO">
>              <sql name="categoryid"/>
>          </field>
> 
>          <field name="manufacturer"  
> type="com.company.beans.content.ManufacturerDTO">
>              <sql name="manufacturerid"/>
>          </field>
> 
>          <!-- Load all dataSource to go with it -->
>          <field name="dataSource"  
> type="com.company.beans.content.ProductDataSourceDTO" required="true"  
> collection="arraylist" set-method="setDataSources"  
> get-method="getDataSources">
>              <sql many-key="productid" />
>          </field>
> 
>          <!-- Load all headers to go with it  -->
>          <field name="headers"  
> type="com.company.beans.content.ProductHeaderDTO" required="true"  
> collection="arraylist" set-method="setHeaders" get-method="getHeaders">
>              <sql many-key="categoryid" />
>          </field>
> 
>          <!-- Load all accessoryProducts to go with it
>          <field name="accessoryProduct"  
> type="com.company.beans.content.AccessoryProductDTO" required="true"  
> collection="arraylist" set-method="setAccessories"  
> get-method="getAccessories">
>              <sql many-key="productid" />
>          </field>
>          -->
>      </class>
> 
> 
> 
> 
> 
>      <class name="com.company.beans.content.ProductDataSourceDTO"  
> identity="id" key-generator="MAX">
>          <cache-type type="unlimited"/>
>          <map-to table="productdatasources" />
> 
>          <field name="id" type="integer">
>              <sql name="productdatasourcesid" type="integer" />
>          </field>
> 
>          <field name="productid" type="integer">
>              <sql name="productid" type="integer" />
>          </field>
> 
>          <field name="code" type="string">
>              <sql name="datasourcesku" type="char" />
>          </field>
> 
>          <field name="name" type="string">
>              <sql name="datasource" type="char" />
>          </field>
> 
>       </class>
> 
> 
> 
> 
> 
>      <class name="com.company.beans.content.ProductHeaderDTO"  
> identity="id" key-generator="MAX">
>          <cache-type type="unlimited"/>
>          <map-to table="productheader" />
> 
>          <field name="id" type="integer">
>              <sql name="productheaderid" type="integer" />
>          </field>
> 
>          <field name="name" type="string">
>              <sql name="name" type="char" />
>          </field>
> 
>          <field name="categoryID" type="integer">
>              <sql name="categoryid" type="integer" />
>          </field>
> 
>          <!-- Load all accessoryProducts to go with it -->
>          <field name="attributes"  
> type="com.company.beans.content.ProductAttributeDTO" required="true"  
> collection="arraylist" set-method="setAttributes"  
> get-method="getAttributes">
>              <sql many-key="templateheaderid" />
>          </field>
> 
>       </class>
> 
> 
> ****** Table Structure for product, productdatasources, and  
> productheader ***********
> 
> 
> CREATE TABLE product (
>    productid int(10) unsigned NOT NULL default '0',
>    manufacturerid int(10) unsigned NOT NULL default '0',
>    isactive tinyint(1) NOT NULL default '0',
>    mfgpartno varchar(25) NOT NULL default '',
>    description text NOT NULL,
>    productstatusid tinyint(4) NOT NULL default '0',
>    categoryid int(10) unsigned NOT NULL default '0',
>    PRIMARY KEY (productid),
>    INDEX (manufacturerid),
>    INDEX (categoryid)
> ) TYPE=InnoDB;
> 
> 
> 
> CREATE TABLE productdatasources (
>    productdatasourcesid int(10) unsigned NOT NULL default '0',
>    productid int(10) unsigned NOT NULL default '0',
>    datasource varchar(60) binary default NULL,
>    datasourcesku varchar(60) binary default NULL,
>    PRIMARY KEY (productdatasourcesid),
>    INDEX (productid)
> ) TYPE=InnoDB;
> 
> 
> CREATE TABLE productheader (
>    productheaderid int(10) unsigned NOT NULL default '0',
>    templateheaderid int(10) unsigned NOT NULL default '0',
>    name varchar(100) binary default NULL,
>    categoryid int(10) unsigned NOT NULL default '0',
>    PRIMARY KEY (productheaderid),
>    INDEX (templateheaderid),
>    INDEX (categoryid)
> ) TYPE=InnoDB;
> 
> 
> 
> 
> ---------------------------------------------
> Ben Christensen
> 
> ----------------------------------------------------------- 
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
>         unsubscribe castor-dev
> 

----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-dev

Reply via email to