Hi,
I am trying to find some information regarding metadata merging in the
following scenario:
We have a base application with some classes, db tables and a
repository_user.xml that describes the mapping.
Lets say we have a base class BasePersistentClassA and some classes that are
based which are included as extent classes in the xml file.
This application is running.
No we develop an optional plugin with a class PluginPersistentClassB that is
based on BasePersistentClassA of the application.
I can now write an additional repository.xml and merge it with:
MetadataManager mm = MetadataManager.getInstance();
DescriptorRepository dr =
mm.readDescriptorRepository("my/additional/plugin_repository.xml");
mm.mergeDescriptorRepository(dr);
However I am failing to get the correct contents regarding the extent-class
definitions of the base class.
I tried to include the following to plugin_repository.xml:
<class-descriptor
class="BasePersistentClassA "
>
<extent-class class-ref="PluginPersistentClassB"/>
</class-descriptor>
<class-descriptor
class="PluginPersistentClassB "
table="MyTable"
>
...
</class-descriptor>
Something is strange, as the following code fragment does not delete anything
at the first broker.deleteByQuery() and fails at the second one:
Criteria crit = new Criteria();
crit.addNotEqualTo("ojbConcreteClass",BaseApplicationClassX.class.getName());
Query q = QueryFactory.newQuery(Transaction.class,crit);
broker.deleteByQuery(q);
// SELECT DISTINCT ACC_TAID FROM ACC_TA
ReportQueryByCriteria subquery = new
ReportQueryByCriteria(BasePersistentClassA .class,null);
subquery.setAttributes(new String[] { "id" });
subquery.setDistinct(true);
Criteria crit = new Criteria();
crit.addNotIn("externalID",subquery);
Query q = QueryFactory.newQuery(Another.class,crit);
broker.deleteByQuery(q);
It seems that the extent definitions from dr are not merged and even corrupt
the existing definitions of the application, as trying to access all classes
from the database results in an NullPointerException:
2007.07.26 17:40:33,375 [0/ServiceRequestDispatcher-P=3/T=7-running:1/1/1] INFO
cleardb: start
java.lang.NullPointerException
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement$TableAlias.hashCode(Unknown
Source)
at java.util.HashMap.hash(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.splitCriteria(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.<init>(Unknown Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement.<init>(Unknown Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getSubQuerySQL(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSubQuery(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendParameter(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendInCriteria(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendCriteria(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendSQLClause(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.asSQLStatement(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendClause(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.appendWhereClause(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlDeleteByQuery.buildStatement(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.getStatement(Unknown
Source)
at
org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeDelete(Unknown Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.deleteByQuery(Unknown Source)
at
org.apache.ojb.broker.core.PersistenceBrokerImpl.deleteByQuery(Unknown Source)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.deleteByQuery(Unknown
Source)
at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.deleteByQuery(Unknown
Source)
[...]
If I include the table="" part, I get the NullPointerException at:
so it seems that the existing class definition is not merged with the
additional data but overwritten.
Ommiting the extent-class-definitions from the additional xml file, I can
access all classes of the base application, but not of the plugin. As we have
several plugins, we dont want any dependencies from the base application to the
plugins.
Any hints are appreciated.
Best regards
Bernd
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]