[hibernate-issues] [Hibernate-JIRA] Created: (HHH-4067) query cache always returns result with lazy collections even the query eager fetch the collection

shaoxian yang (JIRA) noreply at atlassian.com
Mon Aug 3 14:26:12 EDT 2009


query cache always returns result with lazy collections even the query eager fetch the collection
-------------------------------------------------------------------------------------------------

                 Key: HHH-4067
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4067
             Project: Hibernate Core
          Issue Type: Bug
          Components: caching (L2), query-criteria
    Affects Versions: 3.3.2
         Environment: hibernate 3.3.2
ehcache 1.6.0
            Reporter: shaoxian yang


I am trying to give second level cache and query cache a try for my project. here is the versio information:

1. Hibernate: 3.3.2
2. EHCache: 1.6.0

However, although query cache seems to be working. It always return result with lazy collections, even if my original query eagerly fetch the collections. For example:

In Service class
// open session
criteria = session.createCriteria(Podcast.class);
criteria.setFirstResult(offset);
org.hibernate.Criteria criteria = session.createCriteria(Podcast.class);
criteria.setFetchMode("podcastCategoryMappings", FetchMode.JOIN);
criteria.add(Restrictions.in("id", podIds));
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
criteria.addOrder(Order.asc("title"));
criteria.setCacheable(true); // turn on cache
podcasts = criteria.list();
// close session 

In client class, I expect getting a podcast class, with podcastCategoryMappings collection fetched.

@Test
public void testGetAllPodcasts() {
// first time, it goes through database, and put into cache the query result (id=1), entity (podcast), collections(podcastCategoryMapppings)
List<Podcast> podcasts = _service.getPodcasts(0, 1);

for (Podcast pod: podcasts) {

Set<PodcastCategoryMapping> mappings = pod.getPodcastCategoryMappings();
for (PodcastCategoryMapping mapping: mappings) {
System.out.println("pod title/id: " + pod.getTitle() + "/" + pod.getId() + " category id: " + mapping.getCategoryId());
}


// second time, the results come from cache. I shall expect cache hit for query result, entity(podcast), and collections. 
// However, i only see cache hit for query result and entity, not the collections. 
podcasts = _service.getPodcasts(0, 1);

// It will fail with LazyInitializationException since collection is not fully initialized when result returned from cache 
for (Podcast pod: podcasts) {
System.out.println("pod id: " + pod.getId());

Set<PodcastCategoryMapping> mappings = pod.getPodcastCategoryMappings();
for (PodcastCategoryMapping mapping: mappings) {
System.out.println("pod title/id: " + pod.getTitle() + "/" + pod.getId() + " category id: " + mapping.getCategoryId());
}

}
}


I turned on the debug message for hibernate cache related classes, so that I know what is wrong with cache. 
log4j.logger.org.hibernate.cache.ReadWriteCache=TRACE
log4j.logger.org.hibernate.cache.UpdateTimestampsCache=TRACE
log4j.logger.org.hibernate.cache.StandardQueryCache=TRACE


Can someone from hibernate team take a look at this and confirm if this is a bug? I am very close to place this into a project. If this is not working, I guess, I have to manage cache myself, rather than using hibernate to manage the cache. The bottom line is that cache should not return inconsistent result like this.

Thanks.  Feel free to let me know any more information is needed for this problem

-- 
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