Hi all,
I have a complicated situation which I have run into using proxies and
interfaces...
Classes:
Interface Group
Interface StudentGroup extends Group
Interface StaffGroup extends Group
Class GroupImpl implements Group
Class StudentGroupImpl extends GroupImpl implements StudentGroup
Class StaffGroupImpl extends GroupImpl implements StaffGroup
Repository:
<class-descriptor class="Group">
<extent-class class-ref="GroupImpl"/>
<extent-class class-ref="StaffGroup"/>
<extent-class class-ref="StudentGroup"/>
</class-descriptor>
<class-descriptor class="GroupImpl" table="PaperGroup"
proxy="dynamic">
.... Fields ...
<collection-descriptor
name="membership"
element-class-ref="AbstractEntity"
auto-retrieve="true"
auto-update="false"
indirection-table="Group_AbstractEntity"
>
<fk-pointing-to-this-class column="id_Group"/>
<fk-pointing-to-element-class column="id_AbstractEntity"/>
</collection-descriptor>
</class-descriptor>
<class-descriptor class="StaffGroup">
<extent-class class-ref="StaffGroupImpl"/>
</class-descriptor>
<class-descriptor class="StaffGroupImpl" table="PaperGroup"
proxy="dynamic">
.... Fields ...
<collection-descriptor
name="membership"
element-class-ref="AbstractEntity"
auto-retrieve="true"
auto-update="false"
indirection-table="Group_AbstractEntity"
>
<fk-pointing-to-this-class column="id_Group"/>
<fk-pointing-to-element-class column="id_AbstractEntity"/>
</collection-descriptor>
</class-descriptor>
<class-descriptor class="StudentGroup">
<extent-class class-ref="StudentGroupImpl"/>
</class-descriptor>
<class-descriptor class="StudentGroupImpl" table="PaperGroup"
proxy="dynamic">
.... Fields ...
<collection-descriptor
name="membership"
element-class-ref="AbstractEntity"
auto-retrieve="true"
auto-update="false"
indirection-table="Group_AbstractEntity"
>
<fk-pointing-to-this-class column="id_Group"/>
<fk-pointing-to-element-class column="id_AbstractEntity"/>
</collection-descriptor>
</class-descriptor>
One question - is what I've done the 'right' way to map this? Or should
it be more like the following?
<class-descriptor class="Group">
<extent-class class-ref="GroupImpl"/>
</class-descriptor>
<class-descriptor class="GroupImpl">
<extent-class class-ref="StaffGroup"/>
<extent-class class-ref="StudentGroup"/>
</class-descriptor>
My way seems to work okay for queries and operations, except the
following. I have another object (Paper) that uses a QueryCustomizer on
a collection to find Groups which don't belong to other Groups (ie. Are
Top-Level Groups). It is also proxied dynamically.
public Query customizeQuery(Object anObject, PersistenceBroker
aBroker, CollectionDescriptor aCod, QueryByCriteria aQuery) {
ReportQueryByCriteria subQuery;
Criteria subCrit = new Criteria();
Criteria crit = new Criteria();
subCrit.addEqualToField("membership.id",
Criteria.PARENT_QUERY_PREFIX + "id");
subQuery = QueryFactory.newReportQuery(Group.class, subCrit);
subQuery.setColumns(new String[] { "membership.id" });
subQuery.setDistinct(true);
aQuery.getCriteria().addNotIn("id", subQuery);
return aQuery;
}
When the Paper is resolved I get the following:
[org.apache.ojb.broker.accesslayer.IndirectionHandler] ERROR: Method
invoking failed for method *getTitle* on object null
org.apache.ojb.broker.PersistenceBrokerException:
java.lang.NullPointerException
org.apache.ojb.broker.PersistenceBrokerException:
org.apache.ojb.broker.PersistenceBrokerException:
java.lang.NullPointerException
at
org.apache.ojb.broker.accesslayer.IndirectionHandler.materializeSubject(
IndirectionHandler.java:345)
at
org.apache.ojb.broker.accesslayer.IndirectionHandler.getRealSubject(Indi
rectionHandler.java:309)
at
org.apache.ojb.broker.accesslayer.IndirectionHandler.invoke(IndirectionH
andler.java:284)
at $Proxy5.getTitle(Unknown Source)
at
nz.ac.auckland.markit.netbeans.nodes.PaperNode.<init>(PaperNode.java:93)
at
nz.ac.auckland.markit.netbeans.modules.logindialog.ConnectionManager.loa
dPapers(ConnectionManager.java:123)
at
nz.ac.auckland.markit.netbeans.modules.logindialog.ConnectionManager$1.r
un(ConnectionManager.java:103)
at java.lang.Thread.run(Thread.java:534)
Caused by: org.apache.ojb.broker.PersistenceBrokerException:
java.lang.NullPointerException
at
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Que
ryReferenceBroker.java:250)
at
org.apache.ojb.broker.core.QueryReferenceBroker.retrieveCollection(Query
ReferenceBroker.java:537)
at
org.apache.ojb.broker.core.QueryReferenceBroker.retrieveCollections(Quer
yReferenceBroker.java:695)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getDBObject(Persistence
BrokerImpl.java:1089)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByIdentity(Per
sistenceBrokerImpl.java:1145)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdenti
ty(DelegatingPersistenceBroker.java:296)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdenti
ty(DelegatingPersistenceBroker.java:296)
at
org.apache.ojb.broker.accesslayer.IndirectionHandler.materializeSubject(
IndirectionHandler.java:334)
... 7 more
Caused by: java.lang.NullPointerException
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement$TableAlias.hashC
ode(SqlQueryStatement.java:1913)
at java.util.HashMap.hash(HashMap.java:261)
at java.util.HashMap.put(HashMap.java:379)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Sq
lQueryStatement.java:1614)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(SqlQueryS
tatement.java:155)
at
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(SqlSelec
tStatement.java:104)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getSubQuerySQL(S
qlQueryStatement.java:915)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSubQuery(S
qlQueryStatement.java:890)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendParameter(
SqlQueryStatement.java:875)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendInCriteria
(SqlQueryStatement.java:727)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendCriteria(S
qlQueryStatement.java:791)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSQLClause(
SqlQueryStatement.java:854)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.asSQLStatement(S
qlQueryStatement.java:631)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendClause(Sql
QueryStatement.java:557)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendWhereClaus
e(SqlQueryStatement.java:509)
at
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.getStatement(Sq
lSelectStatement.java:271)
at
org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl.getPrepare
dSelectStatement(SqlGeneratorDefaultImpl.java:197)
at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(JdbcAccess
Impl.java:314)
at
org.apache.ojb.broker.accesslayer.RsQueryObject.performQuery(RsQueryObje
ct.java:113)
at
org.apache.ojb.broker.accesslayer.RsIterator.<init>(RsIterator.java:211)
at
org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(RsIter
atorFactoryImpl.java:97)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(
PersistenceBrokerImpl.java:1637)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Pe
rsistenceBrokerImpl.java:1119)
at
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Que
ryReferenceBroker.java:143)
at
org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Que
ryReferenceBroker.java:242)
... 14 more
Ideas? Trying the other mapping method didn't seem to work better... I'm
using CVS HEAD as of today...
Thanks for your help,
Rob.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]