Big thanks Fay! Will it be included in the tomorrows snapshot in maven repository? - I am not sure about the repository update policy - is it a nightly build version there, isn't it? It would simplify deployment in our test environment. Best regards, Krzysztof
Fay Wang wrote: > > hi Krzysztof, > I have checked the fix into the trunk (r-806011). Please extract > the fix, enhance your entities and run the test case again. Please let me > know if you still have problem. > > Regards, > Fay > > > > > > ----- Original Message ---- > From: Krzysztof <[email protected]> > To: [email protected] > Sent: Wednesday, August 19, 2009 1:28:44 PM > Subject: Re: Enum as a Key in a Map > > > Thank you Fay, > Probably ApplicationIdTool could be updated as well - it actually creates > some code for such cases, but not digestible by the compiler. > Best regards, > Krzysztof > > > Fay Wang wrote: >> >> Hi Krzysztof, >> This is a generic problem in openjpa. If an entity, say EntityA, has >> an IdClass which contains an Enum type, and EntityB has a one-to-one >> relationship with EntityA. This problem will surface during retrieval of >> EntityA when doing the findBy for EntityB. Apparently there is a bug in >> the Enhancer code. I will open a JIRA for this problem. >> >> Regards, >> Fay >> >> >> >> >> >> >> ----- Original Message ---- >> From: Krzysztof <[email protected]> >> To: [email protected] >> Sent: Wednesday, August 19, 2009 12:07:31 PM >> Subject: Re: Enum as a Key in a Map >> >> >> Thank you, >> I just tried to add Id class to the enum as a dirty hack but it's not >> doable >> of course. >> Good luck! >> Krzysztof >> >> >> Fay Wang wrote: >>> >>> Hi Krzysztof, >>> Given your description below, I am able to reproduce this problem. I >>> will take a look at it. Thanks! >>> >>> Regards, >>> Fay >>> >>> >>> >>> >>> >>> ----- Original Message ---- >>> From: Krzysztof <[email protected]> >>> To: [email protected] >>> Sent: Wednesday, August 19, 2009 11:38:36 AM >>> Subject: Re: Enum as a Key in a Map >>> >>> >>> Thanks Kevin, >>> >>> Certainly, I have checked your roadmap and the relevant JIRA issue, also >>> test cases you have in the trunk - have not seen @MapKeyEnumerated used >>> with >>> @OneToMany though. >>> >>> In the Id class of the child I kept enum as a field and used ordinal() >>> obviously. >>> >>> I'm debugging this now and can see that _key enum field of the oid >>> passed >>> to >>> pcCopyKeyFieldsToObjectId is null. As mentioned before, value in the DB >>> looks ok. >>> >>> After dissasembling public void pcCopyKeyFieldsToObjectId(FieldSupplier >>> fieldsupplier, Object obj) >>> of that class I can see that >>> >>> TSimplId.tsType = (TSType)((ObjectId)fieldsupplier.fetchObjectField(2 >>> + >>> i)).getId(); >>> >>> for some reason enum is treated as a composite Id and cast to ObjectId >>> fails? >>> >>> >>> >>> Cheers, >>> Krzysztof >>> >>> >>> Kevin Sutter wrote: >>>> >>>> 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 <[email protected]> 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. >>>>> >>>> >>>> >>> >>> -- >>> View this message in context: >>> http://n2.nabble.com/Enum-as-a-Key-in-a-Map-tp1639596p3474458.html >>> Sent from the OpenJPA Users mailing list archive at Nabble.com. >>> >>> >>> >>> >>> >>> >> >> -- >> View this message in context: >> http://n2.nabble.com/Enum-as-a-Key-in-a-Map-tp1639596p3474663.html >> Sent from the OpenJPA Users mailing list archive at Nabble.com. >> >> >> >> >> >> > > -- > View this message in context: > http://n2.nabble.com/Enum-as-a-Key-in-a-Map-tp1639596p3475105.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/Enum-as-a-Key-in-a-Map-tp1639596p3480093.html Sent from the OpenJPA Users mailing list archive at Nabble.com.
