Hi Krzysztof, The MapKeyEnumerated support was introduced as part of JPA 2.0. It looks like this was committed via OPENJPA-1055. I've pinged Fay (owner of the JIRA) to take a look to see if she has any ideas. If you are interested in what's been done for JPA 2.0 already, you can reference our roadmap [1]. I'm bringing this up in case you try some other JPA 2.0 items that haven't even been touched yet... :-)
Thanks, Kevin [1] http://openjpa.apache.org/jpa-20-roadmap.html On Wed, Aug 19, 2009 at 12:30 PM, Krzysztof <yaz...@gmail.com> wrote: > > Hello, > I'm reviving this as @MapKeyEnumerated has been introduced recently which > seemed addressing this issue. > Unfortunately, if I use enum as a key where Source is amended with > following > annotation for the map: > > > @OneToMany(mappedBy = "source",cascade={ CascadeType.ALL },fetch = > FetchType.LAZY, orphanRemoval = true) > @MapKeyEnumerated(EnumType.ORDINAL) > @MapKey(name = "tsType") > > > objects are committed gracefully and generated data and schema looks ok, > but > the exception reappears during retrieval: > > java.lang.ClassCastException: TSType cannot be cast to > org.apache.openjpa.util.ObjectId > > > gaia.cu7.omimpl.ClassificationResultsImpl.pcCopyKeyFieldsToObjectId(ClassificationResultsImpl.java) > > > org.apache.openjpa.enhance.PCRegistry.copyKeyFieldsToObjectId(PCRegistry.java:172) > > > org.apache.openjpa.util.ApplicationIds.fromPKValues(ApplicationIds.java:219) > > > org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:216) > > > org.apache.openjpa.jdbc.meta.ClassMapping.getObjectId(ClassMapping.java:147) > > > org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:934) > > org.apache.openjpa.jdbc.sql.AbstractResult.load(AbstractResult.java:280) > > > org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.load(SelectImpl.java:2349) > > org.apache.openjpa.jdbc.meta.strats.RelationToManyInverseKeyFieldStrategy.loadElement(RelationToManyInverseKeyFieldStrategy.java:87) > > org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(StoreCollectionFieldStrategy.java:554) > org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:919) > > > org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:641) > > > org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:116) > > org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78) > > > org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:3035) > > > org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:3113) > > > org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1606) > > > org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1591) > Source.pcGetclassificationResultsMap(SourceImpl.java) > > > 2.0.0 trunk version. > > Is is possible to use enumeration as a Key in a directly mapped (no join > table), bidirectional Map? Anybody with a workaround? > > Best regards, > Krzysztof > > > Krzysztof wrote: > > > > Indeed, changing the map to be keyed on a plain type does not solve the > > problem until the owning 'source' field becomes plain type too. > > So, > > > > <Source> > > ... > > @OneToMany(mappedBy="source",cascade=CascadeType.ALL) > > @MapKey(name="tsType") > > > > private Map<Integer, TSImpl> tsMap; > > ... > > </Source> > > <TSimpl> > > @Id > > @Basic(optional=false) > > @Enumerated(EnumType.ORDINAL) > > @Column(name="tsType",updatable=false) > > private TSType tsType; //stays as enum, same exception thrown > > </TSImpl> > > gives exactly same cast exception, but if we change this part of Id to > int > > it works. Also calling persist on root persists map elements properly. > > @Id > > @Basic(optional=false) > > // @Enumerated(EnumType.ORDINAL) > > @Column(name="tsType",updatable=false) > > // private TSType tsType; > > private int tsType; > > > > This is not really elegant and affects a lot of code. Could you please > > suggest any workaround so enum could be used as a key and is compatible > > with ObjectId? Annotating enum as Embeddable gives enhancer error and > > creating class wrapping an enum is also questionable in this particular > > case. > > > > Best regards, > > Krzysztof > > > > > > > > -- > View this message in context: > http://n2.nabble.com/Enum-as-a-Key-in-a-Map-tp1639596p3474057.html > Sent from the OpenJPA Users mailing list archive at Nabble.com. >