[hibernate-issues] [Hibernate-JIRA] Created: (HHH-2126) collection not getting filtered to requested subclasses

Patrick Moore (JIRA) noreply at atlassian.com
Mon Oct 2 21:41:24 EDT 2006


collection not getting filtered to requested subclasses
-------------------------------------------------------

         Key: HHH-2126
         URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2126
     Project: Hibernate3
        Type: Bug

  Components: core  
    Versions: 3.2.0.cr4    
    Reporter: Patrick Moore


=========================
The setup 
=========================
I have a class that has two maps defined in it to access MessageEndPointImpl instances. MessageEndPointImpl and MessageSourcePointImpl are subclasses stored in the same table.

The first map accesses MessageEndPointImpls by their database ids:

        <map name="messageEndPointsByEntityKey" inverse="true"  access="field" 
        	cascade="all-delete-orphan">
            <key column="BROADCAST_PROVIDER" not-null="true"/>
            <map-key type="long" column="ID" />
            <one-to-many 
              class="com.transparentpolitics.core.messagehandling.MessageEndPointImpl"/>
        </map>

The second map is to access MessageEndPointImpls by their lookup key which only some MessageEndPointImpls have:

        <map name="messageEndPointsByLookupKey" inverse="true" access="field" 
        		where="LOOKUPKEY IS NOT NULL">
            <key column="BROADCAST_PROVIDER" not-null="true"/>
            <map-key type="string" column="LOOKUPKEY" />
            <one-to-many 
              class="com.transparentpolitics.core.messagehandling.MessageEndPointImpl"/>
        </map>

=======================
The problem
=======================
Trying to access the MessageEndPointImpls using the second map results in this exception. It is trying to include in the returned collection, the MessageSourcePointImpls. This is clearly wrong because the map definition specifies a one-to-many mapping with MessageEndPointImpl

org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: com.transparentpolitics.core.messagehandling.MessageEndPointImpl (loaded object was of wrong class class com.transparentpolitics.core.messagehandling.MessageSourcePointImpl)
	at org.hibernate.loader.Loader.instanceAlreadyLoaded(Loader.java:1234)
	at org.hibernate.loader.Loader.getRow(Loader.java:1186)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
	at org.hibernate.loader.Loader.doQuery(Loader.java:689)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
	at org.hibernate.loader.Loader.loadCollection(Loader.java:1918)
	at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
	at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
	at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
	at org.hibernate.collection.PersistentMap.values(PersistentMap.java:196)
	at com.transparentpolitics.core.BroadcastProvider.getMessageEndPointSet(BroadcastProvider.java:425)
	at com.transparentpolitics.core.BroadcastProvider.getMessageEndPointsMonitoringTopics(BroadcastProvider.java:491)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:185)
	at com.transparentpolitics.core.BroadcastProvider$$EnhancerByCGLIB$$f7a6748d.getMessageEndPointsMonitoringTopics(<generated>)
==============================
Workaround:
==============================
changing the map definition to explicitly filter on the discriminator-value for MessageEndPointImpl works.

        <map name="messageEndPointsByLookupKey" inverse="true" access="field" 
        		where="LOOKUPKEY IS NOT NULL AND POINT_TYPE='MEP'">
            <key column="BROADCAST_PROVIDER" not-null="true"/>
            <map-key type="string" column="LOOKUPKEY" />
            <one-to-many 
              class="com.transparentpolitics.core.messagehandling.MessageEndPointImpl"/>
        </map>



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list