DataNucleus - Products
  History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: CORE-2567
Type: New Feature New Feature
Status: Open Open
Priority: Minor Minor
Assignee: Unassigned
Reporter: Martin Taal
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
JPOX Core

Support embedded inherited objects, and embedded reference/interface objects

Created: 31/Oct/05 06:24 PM   Updated: 19/Aug/07 09:59 PM
Component/s: JDO, Datastore Support
Affects Version/s: 1.1.0-rc-1
Fix Version/s: None

File Attachments: 1. Zip Archive JPOXTC.zip (3 kb)



 Description  « Hide
 Hi,
I have a member which is declared in java with an interface type. This member should be embedded. I try to combine embedded with implementation-classes to let jpox know which implementation class I am using for the interface. The enhancer fails with the message that the member is declared with a type (the interface type) which is not persistence capable. Which is true as it is an interface. However because I also specify the implementation-classes extension I hoped that this would help, but it doesn't apparently.

Did I do something wrong in my metadata (see below) or is it possible for jpox to
use the implementation-classes also for embedded elements?

Thanks for any help here!

gr. Martin

<jdo>

<package name="org.elver.store.test.emf.annotations.component">

<class name="ComponentOne" identity-type="datastore" requires-extent="true"
detachable="true" persistence-modifier="persistence-capable"
embedded-only="true" table="ComponentOne">

<inheritance strategy="new-table">
<discriminator column="CLASS_DISCRIMINATOR" strategy="class-name" index="true"/>
</inheritance>

<field name="firstName" persistence-modifier="persistent">
</field>

<field name="age" persistence-modifier="persistent">
</field>
<field name="hairColor" persistence-modifier="persistent" null-value="none">
<column allows-null="true"/>
</field>
</class>

</package>

<package name="org.elver.store.test.emf.annotations.component.impl">

<class name="ItemImpl" identity-type="datastore" requires-extent="true"
detachable="true" persistence-modifier="persistence-capable" table="Item">

<implements name="org.elver.store.test.emf.annotations.component.Item"/>

<implements name="org.eclipse.emf.ecore.EObject"/>

<implements name="org.eclipse.emf.common.notify.Notifier"/>

<inheritance strategy="new-table">
<discriminator column="CLASS_DISCRIMINATOR" strategy="class-name" index="true"/>
</inheritance>

<field name="emfComponent" persistence-modifier="persistent" dependent="true" delete-action="restrict" embedded="true">
<extension vendor-name="jpox" key="implementation-classes"
value="org.elver.store.test.emf.annotations.component.impl.EMFComponentImpl" />
<embedded>

<field name="firstName" persistence-modifier="persistent" null-value="exception">
</field>

<field name="age" persistence-modifier="persistent">
</field>
</embedded>
</field>

<field name="nonEmfComponent" persistence-modifier="persistent" dependent="true" delete-action="restrict">
<collection element-type="org.elver.store.test.emf.annotations.component.ComponentOne" dependent-element="true"/>
<element>
<embedded>

<field name="firstName" persistence-modifier="persistent">
</field>

<field name="age" persistence-modifier="persistent">
</field>
</embedded>
</element>
<order column="ITEMNONEMFCOMPONENT_IDX"/>
<foreign-key delete-action="restrict" update-action="cascade"/>
</field>
</class>

<class name="EMFComponentImpl" identity-type="datastore" requires-extent="true"
detachable="true" persistence-modifier="persistence-capable"
embedded-only="true" table="EMFComponent">

<implements name="org.elver.store.test.emf.annotations.component.EMFComponent"/>

<implements name="org.eclipse.emf.ecore.EObject"/>

<implements name="org.eclipse.emf.common.notify.Notifier"/>

<inheritance strategy="new-table">
<discriminator column="CLASS_DISCRIMINATOR" strategy="class-name" index="true"/>
</inheritance>

<field name="firstName" persistence-modifier="persistent" null-value="exception">
</field>

<field name="age" persistence-modifier="persistent">
</field>
<field name="ageESet" persistence-modifier="persistent" null-value="none">
<column allows-null="true"/>
</field>
</class>

</package>

</jdo>

 All   Comments   Change History      Sort Order: Ascending order - Click to sort in descending order
Andy Jefferson - 22/Nov/05 09:53 AM
As mentioned in the JPOX docs, embedded inheritance and embedded reference fields are not supported and are very low priority.

Andy Jefferson - 15/Jun/07 03:15 PM
Taken from [ENHANCER-94]
Five classes:
 base classe A
 B inherits from A, C inherits from B
 D inherits from A, E inherits from D

Inheritance strategy:
 A new-table
 B subclass-table, C new-table
 D new-table, E superclass-table

E references one C (embedded).
 
org.jpox.metadata.InvalidMetaDataException: Class org.jpox.test.C has field B.dimension declared in MetaData, but this field doesnt exist in the class!
at org.jpox.metadata.EmbeddedMetaData.populate(EmbeddedMetaData.java:316)
at org.jpox.metadata.AbstractPropertyMetaData.populate(AbstractPropertyMetaData.java:909)
at org.jpox.enhancer.bcel.metadata.BCELFieldMetaData.populate(BCELFieldMetaData.java:287)
at org.jpox.metadata.ClassMetaData.populatePropertyMetaData(ClassMetaData.java:562)
at org.jpox.metadata.ClassMetaData.populate(ClassMetaData.java:258)
at org.jpox.metadata.MetaDataManager.populateFileMetaData(MetaDataManager.java:1547)
at org.jpox.metadata.MetaDataManager.initialise(MetaDataManager.java:291)
at org.jpox.enhancer.JPOXEnhancer.getFileMetaDataForInput(JPOXEnhancer.java:716)
at org.jpox.enhancer.JPOXEnhancer.main(JPOXEnhancer.java:531)

Andy Jefferson - 15/Jun/07 03:16 PM
Provided testcase from user "nicolas" on [ENHANCER-94]

Andy Jefferson - 07/Aug/07 09:54 AM
CVS HEAD had some changes recently to allow some level of interface fields being embedded, but was in the context of "persistent-interfaces" which is differend to your situation. You could try a nightly build to see what the situation is now

Martin Taal - 19/Aug/07 09:59 PM
Hi Andy,
Thanks, I am still at version 1.1.8 and it will be a while (few months) before I move Teneo over to the newest jpox version (1.2). I will probably retry it then.

gr. Martin