Hello


I've got a problem with collection descriptors and interfaces. My class hierarchy is something like this :


<class-descriptor class="package.interfaces.InterfaceEntity">
        <extent-class class-ref="package.interfaces.InterfacePlace" />
        <extent-class class-ref="package.InterfaceObject" />
        <extent-class class-ref="package.InterfaceCharacter" />
        <extent-class class-ref="package.Area" />
</class-descriptor>

<class-descriptor class="package.interfaces.InterfacePlace">
        ...
</class-descriptor>

...


All classes extending (directly or not) InterfaceEntity have a field which represents the member who has added
it to the database.



...


<field-descriptor
        name="memberId"
        column="member"
        jdbc-type="BIGINT"
/>

...

And I have a Class named 'Member' which represents a member. The problem occurs when I want to know what are the
InterfaceEntity objects created by a member. Such a collection-descriptor doesn't work :


<collection-descriptor name="additions" proxy="true" element-class-ref="package.interfaces.InterfaceEntity">
<inverse-foreignkey field-ref="memberId" />
</collection-descriptor>


StackTrace at the end of this mail.

---

I've searched for other solutions, and here is what I've tested

a) replacing the element-class-ref in the descriptor with a class which is not an Interface (such as package.Area), it works.
--> drawback : I'll have to declare one collection-descriptor for each class implementing InterfaceEntity :(


b) coding somethink like this

Criteria c = new Criteria();
c.addEqualTo("memberId", new Long(4));
QueryByCriteria q = new QueryByCriteria(InterfaceEntity.class, c);

the results of the query are perfectly right.

---

More strange, in another class I have a reference descriptor like this, which work also perfectly :

<reference-descriptor
        name="entity"
        class-ref="package.interfaces.InterfaceEntite"
        proxy="true"
>
        <foreignkey field-ref="entityId" />
</reference-descriptor>           


I'd like to know where I've been wrong in my repository.xml. Solution (b) is quite good, but I think the cleaniest way
is to declare this collection in the repository. Any help is welcome :)



Thomas



PS :


***********
 Test.java
***********

InterfaceMember m = Member.getInstance(4);                      
log("name : " + m.getName());
log("nb add : " + m.getAdditions().size());


*********** STACK TRACE ***********

GRAVE: Method invoking failed for method *getName* on object null
org.apache.ojb.broker.PersistenceBrokerException: org.apache.ojb.broker.OJBRuntimeException: Incorrect field reference "memberId" in [EMAIL PROTECTED] delete=false,cascade retrieve=true,cascade store=false,is lazy=false,class of Items=interface package.interfaces.InterfaceEntity]
at org.apache.ojb.broker.accesslayer.IndirectionHandler.materializeSubject(Unknown Source)
at org.apache.ojb.broker.accesslayer.IndirectionHandler.getRealSubject(Unknown Source)
at org.apache.ojb.broker.accesslayer.IndirectionHandler.invoke(Unknown Source)
at $Proxy0.getName(Unknown Source)
at package.Test.main(Test.java:26)
Caused by: org.apache.ojb.broker.OJBRuntimeException: Incorrect field reference "memberId" in [EMAIL PROTECTED] delete=false,cascade retrieve=true,cascade store=false,is lazy=false,class of Items=interface package.interfaces.InterfaceEntity]
at org.apache.ojb.broker.metadata.ObjectReferenceDescriptor.getForeignKeyFieldDescriptors(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getFKQuery1toN(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getFKQuery(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveCollection(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveCollections(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getDBObject(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByIdentity(Unknown Source)
at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown Source)
at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown Source)
... 5 more
org.apache.ojb.broker.PersistenceBrokerException: Error invoking:getName
at org.apache.ojb.broker.accesslayer.IndirectionHandler.invoke(Unknown Source)
at $Proxy0.getName(Unknown Source)
at package.Test.main(Test.java:26)
Caused by: org.apache.ojb.broker.PersistenceBrokerException: org.apache.ojb.broker.OJBRuntimeException: Incorrect field reference "memberId" in [EMAIL PROTECTED] delete=false,cascade retrieve=true,cascade store=false,is lazy=false,class of Items=interface package.interfaces.InterfaceEntity]
at org.apache.ojb.broker.accesslayer.IndirectionHandler.materializeSubject(Unknown Source)
at org.apache.ojb.broker.accesslayer.IndirectionHandler.getRealSubject(Unknown Source)
... 3 more
Caused by: org.apache.ojb.broker.OJBRuntimeException: Incorrect field reference "memberId" in [EMAIL PROTECTED] delete=false,cascade retrieve=true,cascade store=false,is lazy=false,class of Items=interface package.interfaces.InterfaceEntity]
at org.apache.ojb.broker.metadata.ObjectReferenceDescriptor.getForeignKeyFieldDescriptors(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getFKQuery1toN(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getFKQuery(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveCollection(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveCollections(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getDBObject(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByIdentity(Unknown Source)
at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown Source)
at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown Source)
... 5 more




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to