You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Brian Latimer <bl...@apcc.aspca.org> on 2005/01/13 23:47:00 UTC
Extents of Interfaces without factory methods
I'm attempting to query for all extents of an interface but I don't have a
factory method to create a default instance of my interface.
What I desire to have happen, is for OJB to properly cast each extent into
it's appropriate subclass.
I've found that I can make this happen, but I'm worried that it might not
be a safe method.
I have 2 tables, assets and computers.
Every computer is an asset, but not every asset is a computer.
I use the id field as the primary key for each table and as a foreign key
for the computer table.
My repository structure is below.
I'm using the persistance broker interface to make calls with both
getCollectionByQuery and getObjectByQuery;
What I've found is that OJB will generally cast all extents into a base
"AssetBean" unless I add a redundant anonymous key to the ComputerAssetBean
repository entry.
When there is 1 case of matching id fields in Assets and Computers and I
call getObjectByQuery(Asset.class, id...) the results always come back cast
as an AssetBean but I can see in the debug log that OJB at some point did
try to look at the Computer table.
In the same circumstances, if I instead call
getCollectionByQuery(Asset.class, id...) I will get back a collection with
1 AssetBean, and 1 ComputerAssetBean, which is close enough to the desired
behavior that I can work with it.
My question is: Is this a safe practice?
Is there a better way to insure than an extent of an interface is properly
cast into the most appropriate implimenting sub-class?
<class-descriptor class="org.aspca.vo.Asset">
<extent-class class-ref="org.aspca.vo.AssetBean" />
<extent-class class-ref="org.aspca.vo.ComputerAssetBean" />
</class-descriptor>
<class-descriptor class="org.aspca.vo.AssetBean" table="INVENTR.ASSETS">
<extent-class class-ref="org.aspca.vo.ComputerAssetBean" />
<field-descriptor name="id" primarykey="true" nullable="false"
default-fetch="true" column="ASSETID" jdbc-type="SMALLINT" autoincrement="true"
access="readonly"/>
</class-descriptor>
<class-descriptor class="org.aspca.vo.ComputerAssetBean"
table="INVENTR.COMPUTERS">
<field-descriptor name="id" primarykey="true" nullable="false"
default-fetch="true" column="ASSETID" jdbc-type="SMALLINT" access="readonly"/>
<field-descriptor name="assetId" primarykey="true" nullable="false"
default-fetch="true" column="ASSETID" jdbc-type="SMALLINT" access="anonymous"/>
<field-descriptor name="RAM" default-fetch="true" column="RAM"
jdbc-type="INTEGER"/>
<field-descriptor name="computerName" default-fetch="true"
column="COMPUTERNAME" jdbc-type="CHAR"/>
<reference-descriptor name="super"
class-ref="org.aspca.vo.AssetBean"
auto-retrieve="true"
auto-update="true"
auto-delete="true"
>
<foreignkey field-ref="assetId"/>
</reference-descriptor>
</class-descriptor>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org