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 17:30:00 GMT

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.

Mime
View raw message