[EMAIL PROTECTED] wrote:
I dug a bit deeper in the code to find out why OJB is throwing NPEs instead of giving a bit more of a valuable hint.since the NPE is due to missing fields in the metadata,I added field-descriptors to the class descriptor of the Interface (Template) and it worked fine, thanks.
I assume that a workaround is to add field-descriptors.
Actually you need field-descriptors in your Interface and implementing class, not in the base class itself (as there can be no instances ?).
I think the documentation on the ojb website is not very clear or even erroneous on this point.
I agree that the OJB documentation is not sufficient. Personally, I consider valuable error messages (as opposed to mysterious NPEs) even more important.
We have to work on that.
ClassDescriptor.java:getPkFields()
if (m_isInterface)
{
... // look for implementor classes and return their PkFields
}
// 1.b if not an interface The classdescriptor must have FieldDescriptors
else
{
fields = getFieldDescriptions();
}
// now collect all PK fields
for (int i = 0; i < fields.length; i++)
^^^ NPEactually it was taking the interface for a real class and tried to get its field descriptors, which obviously failed.
m_isInterface is set by RepositoryXmlHandler:
if (table == null)
{
m_CurrentCLD.setIsInterface(true);
}So if there is no table definition for a class-descriptor entry in repository_user.xml, the class will be automatically declared as an interface.
In my example the xdoclet-ojb module automatically creates the table="..." entry unless you specify generate-table-info="false".
To avoid confusion, I have some suggestions:
1) make repository_user more explicit regarding the difference between class/interface
or
2) make xdoclet-ojb more intelligent (e.g. never generate table info for interfaces or issue a warning when doing so)
3) state explicitely in the doc that including table infos for an interface will result in errors
I am willing to work on a patch for 2) but I haven't checked if the xdoclet code is already in the CVS.
I suggest moving the thread to ojb-dev.
regards, Jan
<SNIP from http://db.apache.org/ojb/tutorial3.html#extents>
1. A declaration for InterfaceArticle, defining which classes implement this interface:
<!-- Definitions for org.apache.ojb.broker.InterfaceArticle --> <class-descriptor class="org.apache.ojb.broker.InterfaceArticle"> <extent-class class-ref="org.apache.ojb.broker.Article" /> <extent-class class-ref="org.apache.ojb.broker.BookArticle" /> <extent-class class-ref="org.apache.ojb.broker.CdArticle" /> </class-descriptor> </SNIP>
It doesn't give a hint to include field-descriptors for the interface, or does my setup just happen to be special ?
Moreover, having the obligation to add field descriptors to the interface is not very practical when using the xdoclet-ojb module (where you have to define the mappings on the instance fields), or is there a workaround ?
Sorry, I have no experience with the xdoclet-ojb module. You might start a new thread with that question.
Olli
--------------------------------------------------------------------- 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]
