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]