【问题标题】:Hibernate EntityManager + Query Cache - "join fetch" not workingHibernate EntityManager + Query Cache - “join fetch”不起作用
【发布时间】:2011-08-14 13:57:26
【问题描述】:

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

TypedQuery<Foo> q = em.createQuery(
    "SELECT foo FROM Foo foo " +
    "INNER JOIN FETCH Foo.bar "
);
q.setHint("org.hibernate.cacheable", true);

问题是FETCH 在缓存被命中时似乎没有任何影响,即集合 Foo.bar 没有被初始化。我可以遍历结果列表并手动初始化集合的所有实例,但这会使整个事情变得比不使用查询缓存更慢。

我使用带有 Infinispan 的 JBoss AS 6.0 / Hibernate 3.6 作为缓存引擎。

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

【问题讨论】:

    标签: hibernate jpa join fetch query-cache


    【解决方案1】:

    可以通过将@Cache 应用于集合属性来修复它(当然,目标实体也应该是可缓存的),请参阅21.2.1. Cache mappings

    【讨论】:

    • 谢谢,看来我仍然需要遍历结果列表并初始化集合,尽管它们现在是从缓存而不是数据库加载的。并不能真正解决我的问题,因为在我的现实世界应用程序中,我有一个相对复杂的对象图,我必须部分获取它,并遍历所有集合,其中一些集合本身具有我需要获取的依赖项,吃消除我可能从缓存中获得的任何性能优势。
    • @chris : 也许你应该尝试看看 EntityGraph 是否能满足你的需求。
    猜你喜欢
    • 2020-12-10
    • 2021-12-19
    • 2018-11-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多