[hibernate-issues] [Hibernate-JIRA] Assigned: (HHH-3121) Using fetch="subselect" and second level cache causes NullPointerException
Gail Badner (JIRA)
noreply at atlassian.com
Mon Jan 17 14:42:05 EST 2011
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3121?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gail Badner reassigned HHH-3121:
--------------------------------
Assignee: Gail Badner
> Using fetch="subselect" and second level cache causes NullPointerException
> --------------------------------------------------------------------------
>
> Key: HHH-3121
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3121
> Project: Hibernate Core
> Issue Type: Bug
> Components: caching (L2)
> Affects Versions: 3.2.6
> Environment: Oracle 10g
> Reporter: Adam Brod
> Assignee: Gail Badner
> Fix For: 3.6.1
>
> Attachments: CollectionIssue_TestProgram.zip
>
>
> I've been tuning some of our mappings to use fetch="subselect" to reduce the number of DB queries. However, I have run into two cases where I get the exception below. In both cases, I was loading a list of Videos, which are mapped to a list of other objects. (In this example, Media is the superclass of Video.) I apologize that I can't upload a full working example, but I will include the relevant mapping info.
> <class name="Media" table="media" lazy="false" discriminator-value="0">
> <cache usage="nonstrict-read-write"/>
> <id name="id" column="id" type="long">
> <generator class="seqhilo"><param name="sequence">hibernate_hi_sequence</param><param name="max_lo">500</param></generator>
> </id>
> ...
> <list name="tags" lazy="true" table="media_tags" cascade="save-update" fetch="subselect">
> <cache usage="nonstrict-read-write"/>
> <key column="media_id"/>
> <list-index column="idx"/>
> <many-to-many column="tag_id" class="com.brightcove.catalog.Tag"/>
> </list>
> ...
> <subclass name="Video" lazy="false" discriminator-value="1">
> ...
> </subclass>
> </class>
> <class name="Tag" table="tag">
> ...
> </class>
> The HQL being executed is just a simple "from Video v where v.publisher_id = :pubId".
> The line of code where the exception is generated in Video.getDTO() is accessing the Tags list:
> for (Tag tag : getTags()) {
> tags.add(tag.getDTO());
> }
> I've debugged into the Hibernate source to see where the NPE comes from (CollectionLoadContext line 298).
> if ( persister.isVersioned() ) {
> versionComparator = persister.getOwnerEntityPersister().getVersionType().getComparator();
> final Object collectionOwner = getLoadContext().getPersistenceContext().getCollectionOwner( lce.getKey(), persister );
> version = getLoadContext().getPersistenceContext().getEntry( collectionOwner ).getVersion(); //NPE!
> }
> It seems that "collectionOwner" is null, so calling getEntry(collectionOwner) returns null. Calling getVersion() on a null entry is what throws the NPE.
> java.lang.NullPointerException
> at org.hibernate.engine.loading.CollectionLoadContext.addCollectionToCache(CollectionLoadContext.java:298)
> at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:256)
> at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:222)
> at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:195)
> at org.hibernate.loader.Loader.endCollectionLoad(Loader.java:877)
> at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:865)
> at org.hibernate.loader.Loader.doQuery(Loader.java:729)
> at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
> at org.hibernate.loader.Loader.loadCollectionSubselect(Loader.java:2066)
> at org.hibernate.loader.collection.SubselectCollectionLoader.initialize(SubselectCollectionLoader.java:58)
> 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.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:109)
> at org.hibernate.collection.PersistentList.size(PersistentList.java:91)
> at com.brightcove.catalog.EconomicEntity.populateDTO(EconomicEntity.java:460)
> at com.brightcove.catalog.Media.populateDTO(Media.java:192)
> at com.brightcove.catalog.Video.populateDTO(Video.java:854)
> at com.brightcove.catalog.Video.getDTO(Video.java:783)
> at com.brightcove.catalog.Video.getDTO(Video.java:756)
--
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