openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Krzysztof <yaz...@gmail.com>
Subject Re: Enum as a Key in a Map
Date Wed, 19 Aug 2009 20:28:44 GMT

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 <yazuna@gmail.com>
> To: users@openjpa.apache.org
> 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 <yazuna@gmail.com>
>> To: users@openjpa.apache.org
>> 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 <yazuna@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.
>>>>
>>> 
>>> 
>> 
>> -- 
>> 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.

Mime
View raw message