Hibernate EntityManager+查询缓存-“join fetch”不工作

Hibernate EntityManager+查询缓存-“join fetch”不工作,hibernate,jpa,join,fetch,query-cache,Hibernate,Jpa,Join,Fetch,Query Cache,我正在尝试缓存这样的查询: TypedQuery<Foo> q = em.createQuery( "SELECT foo FROM Foo foo " + "INNER JOIN FETCH Foo.bar " ); q.setHint("org.hibernate.cacheable", true); 问题是,当缓存被命中时,FETCH似乎没有任何效果,即集合Foo.bar没有被初始化。我可以迭代结果列表并手动初始化集合的所有实例,但这会使整个过程比不使用查询缓

我正在尝试缓存这样的查询:

TypedQuery<Foo> q = em.createQuery(
    "SELECT foo FROM Foo foo " +
    "INNER JOIN FETCH Foo.bar "
);
q.setHint("org.hibernate.cacheable", true);
问题是,当缓存被命中时,FETCH似乎没有任何效果,即集合Foo.bar没有被初始化。我可以迭代结果列表并手动初始化集合的所有实例,但这会使整个过程比不使用查询缓存时更慢

我使用JBoss AS 6.0/Hibernate 3.6和Infinispan作为缓存引擎


奇怪的是,根据我通过JMX控制台获得的缓存统计数据,Foo.bar中的对象似乎得到了缓存,但这些对象的缓存没有得到任何命中。

可以通过将@cache应用于集合属性来修复。当然,目标实体也应该是可缓存的,请参见。

谢谢,看起来我仍然需要迭代结果列表并初始化集合,尽管它们现在是从缓存而不是数据库加载的。这并不能真正解决我的问题,因为在我的实际应用程序中,我有一个相对复杂的对象图,我必须部分地获取它,并迭代所有集合,其中一些集合本身具有依赖性,我也需要获取它们,侵蚀了我从缓存中获得的任何性能优势。@克里斯:也许你应该试试EntityGraph是否能满足你的需要。