Hello Fay, Thank you for the hint. In the end I narrowed down the problem to self-referencing, composite ID which is not supported.
Kludging with a generated syntatic Id helps in cases where object model is modifiable but it would be wonderful to have this supported at some time. Do you think it is possible in a foreseeable future? https://issues.apache.org/jira/browse/OPENJPA-291 That's a pity since more and more DBs support hierarchical queries natively (connect-by in oracle, with() in db2, recently postgres) and gives huge performance kick where complicated traversal is needed in a single query. Cheers Krzysztof Fay Wang wrote: > > Hi, > Can you try making AbstractModel an Entity instead of > MappedSuperClass, and making this class a concrete class as shown below? > > // abstract class that has common identity and some additional fields, it > is > //a Key in a map > @Inheritance(strategy = InheritanceType.JOINED) > @Entity > @IdClass(ModelId.ModelImplId.class) > public class AbstractModel { > > ... > > } > > -Fay > > > > > ----- Original Message ---- > From: Krzysztof <[email protected]> > To: [email protected] > Sent: Wednesday, August 5, 2009 9:31:53 AM > Subject: Key and Value limitations in a Map<Key,Value> > > > Hello, > Seems I am completely knotted in a convoluted class graph without any hint > from documentation, spec or forum archive. > > Could somebody enlighten me if it is possible to: > > A. Have a Key in a persistent Map<Key,Value> such as > 1. the Key has a composite ID composed of classes which have composite IDs > themselves? > and > 2. They Key is an abstract class that is also used in a Value as a parent > in ManyToOne relationship being the part of the Values identity (actual > objects - parent and Value being rather different entities) > > Hope this example clarifies this rather complicated scenario: > > //abstract class of which children are Values in a map > @Entity > @IdClass(AbstractTS.TSId.class) //TSId covers SomeOtherClass identity too > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) > public abstract class AbstractTS > { > @id SomeOtherClass parent; > @id int local_id; > @OneToMany > private Map<ModelId, DerivedTS> derivedMap; // DerivedTS inherits from > AbstractTS - seems to impossible to be mapped properly. > > } > > // abstract class that has common identity and some additional fields, it > is > a Key in a map > @Inheritance(strategy = InheritanceType.JOINED) > @MappedSuperclass > @IdClass(ModelId.ModelImplId.class) > public abstract class AbstractModel { > @id AbstractTS parent; > @id int x; > @id double y; > > @Basic > @Lob > double[] some_common_data; > } > > // Identity domain class, that is in fact stripped down version of an > abstractModel, both reuse same ID class, used to retrieve unknown models. > > @IdClass(ModelId.ModelImplId.class) > @Embeddable > public class ModelId { > > @ManyToOne > public AbstractTS parentTS; //could be either DerivedTS or RawTS. > @Id > @Basic > public double some_value; > @Id > public int modelType; > > @Basic > int some_derived_value; > > } > > @Entity > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) > //identity derived from AbstractTS > public class RawTS extends AbstractTS > { > @Basic > int some_values; > } > > @Entity > @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) > @IdClass(DerivedTS.DerivedTSId.class) // inherits from TSId with > additional > Identities for parentTS and parentModel > public class DerivedTS extends AbstractTS { > @ManyToOne > //@PrimaryKeyJoinColumns(..) // possibly to provide direct mappings to > either RawTS or DerivedTS identity fields > @Id > private AbstractTS parentTS; > > @Id > @ManyToOne > //@PrimaryKeyJoinColumns( {... }) //possibly to provide direct > mappings to any model derived from AbstractModel > private AbstractModel parentModel = null; > > } > > > > To create any working mapping for > > Map<ModelId, DerivedTS> seems like an impossible mission, I would > appreciate > any hints if it is doable at all. > > I tried various combinations of @ManyToOne combined with @PrimaryKeys, > @MapPrimaryKeys, @ElementCollection etc. > Persistence.xml lists all the classes, using openjpa 2.0.0 snapshot. > > The last error I got is during enhancement: > [java] Exception in thread "main" > <openjpa-2.0.0-SNAPSHOT-r422266:798026 > fatal user error> org.apache.openjpa.util.MetaDataException: Errors > encountered while resolving metadata. See nested exceptions for details. > [java] at > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:578) > [java] at > org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:323) > [java] at > org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:625) > [java] at > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:556) > [java] at > org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:323) > [java] at > org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:251) > [java] at > org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:4593) > [java] at > org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:4540) > [java] at > org.apache.openjpa.enhance.PCEnhancer$1.run(PCEnhancer.java:4510) > [java] at > org.apache.openjpa.lib.conf.Configurations.launchRunnable(Configurations.java:726) > [java] at > org.apache.openjpa.lib.conf.Configurations.runAgainstAllAnchors(Configurations.java:711) > [java] at > org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:4505) > [java] at > org.apache.openjpa.enhance.PCEnhancer.main(PCEnhancer.java:4496) > [java] Caused by: <openjpa-2.0.0-SNAPSHOT-r422266:798026 fatal user > error> org.apache.openjpa.util.MetaDataException: Field > "DerivedTS.parentModel" cannot be a primary key. It is of an unsupported > type. > [java] at > org.apache.openjpa.meta.ClassMetaData.validateAppIdClassPKs(ClassMetaData.java:2105) > [java] at > org.apache.openjpa.meta.ClassMetaData.validateAppIdClass(ClassMetaData.java:1989) > [java] at > org.apache.openjpa.meta.ClassMetaData.validateIdentity(ClassMetaData.java:1925) > [java] at > org.apache.openjpa.meta.ClassMetaData.validateMeta(ClassMetaData.java:1842) > [java] at > org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1704) > [java] at > org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:733) > [java] at > org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:631) > [java] at > org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:556) > [java] ... 12 more > [java] NestedThrowables: > > > It fails in validateAppIdClassPKs, but it is hard to guess with what type: > ... > 2101 case JavaTypes.PC_UNTYPED: > 2102 case JavaTypes.COLLECTION: > 2103 case JavaTypes.MAP: > 2104 case JavaTypes.OID: // we're validating embedded > fields > 2105 throw new > MetaDataException(_loc.get("bad-pk-type", > 2106 fmds[i])); > .... > > Does it mean Composite IDs are banned in Map's Key completely? > > > Best regards, > Krzysztof > -- > View this message in context: > http://n2.nabble.com/Key-and-Value-limitations-in-a-Map%3CKey%2CValue%3E-tp3393262p3393262.html > Sent from the OpenJPA Users mailing list archive at Nabble.com. > > > __________________________________________________ > Do You Yahoo!? > Tired of spam? Yahoo! Mail has the best spam protection around > http://mail.yahoo.com > > -- View this message in context: http://n2.nabble.com/Key-and-Value-limitations-in-a-Map%3CKey%2CValue%3E-tp3393262p3472153.html Sent from the OpenJPA Users mailing list archive at Nabble.com.
