hibernate - 使用 Hibernate 和 EhCache 缓存集合时出现问题

标签 hibernate caching ehcache

如主题所示,我在使用 Hibernate 和 EhCache 时遇到了一些问题。

我在 Resteasy 应用程序中将 Hibernate 与 mySql 和 EhCache 结合使用。

模型:有几个实体,一些是一对多关系,一些是一对一关系。

  • 测量
    • 标题信息(一对一)
    • 内容(一对一)
      • 放置(一对一(我需要这个元素因为它的元数据)
        • place(带有 place-entities 的集合)(一对多惰性)
          • measure(带有measure-entities的集合)(一对多惰性)
          • timedcode(带有 timecode-eintities 的集合(一对多惰性)
            • measure(带有measure-entities的集合)(一对多惰性)

问题:我正在尝试在类似 createQuery("from Measuring c").list() 的查询中获取我的所有数据。现在有两种缓存结果的方法:Querycache 和 2nd-level-cache。

查询缓存只会缓存测量实体的选择,不用说这不是我期望的行为。好吧,我希望查询缓存缓存所有的 sql 语句。有什么方法可以让它发挥作用吗?

我已经激活了所有实体的缓存。二级缓存将缓存元素但不会再次命中它们(确实如此,但只是测量元素);一些小想法之后我意识到我必须缓存集合以让缓存知道哪些元素属于一起。

嗯,激活所有一对多集合的缓存在获取所有数据作为第一个缓存请求的情况下效果很好。但如果没有问题,我不会写这个。通过其中一个字段查询一个地方作为第一个缓存操作将导致缓存做它应该做的事情:它缓存请求的数据,这意味着一个测量实体(实际上数据库中只有一个),一个标题信息,内容带有地方元素和找到的地方及其子元素。查询另一个地方也很有效。现在我想获取所有元素(上面提到的查询),但我只获取已经查询过的元素。如果语句不包含选择条件,hibernate 似乎只查询缓存。这似乎是缓存集合时的一个小问题。

因此,我需要的是获取查询缓存以缓存所有语句,或者在请求时检索整个集合但已经执行了具体语句的二级缓存。

我还必须提到,在检索具体位置(或所有元素)时,我需要获取完整的测量元素(及其 header 信息等),因为 xml 中的 rest-service 答案和另一端的应用程序需要得到一个测量元素及其所有可能的节点。

好吧,我可以想象,我的查询中有一些错误。所以这里有两个提到的查询:

获取所有数据:createQuery("from Measuring c").setCacheable(true).list()

获取具有具体位置的数据:createQuery("from Measuring measuringElement join fetch measuringElement.content contentElement join fetch contentElement.places placesElement join fetch placesElement.places placeElement WHERE placeElement.name = '"+ name +"'").setCacheable(true).list().

谁能帮帮我?

非常感谢和亲切的问候

最佳答案

你的问题很难理解,所以我只解释一下缓存是如何工作的。

你可以缓存三样东西:

  • 实体
  • 实体集合(即 ToMany 关联)
  • 查询

当使用 get 或 load 时,以及通过 ToOne 关联从另一个实体导航到缓存的实体时,实体的缓存将被命中。仅缓存实体的字段。不是 ToMany 协会。

当通过缓存的 ToMany 关联导航时,集合的缓存将被命中。缓存仅存储集合中实体的 ID。 Hibernate 将尝试使用缓存的 ID 一个一个地获取集合中的所有实体。为了提高效率,目标实体也应该在实体缓存中。

执行缓存查询时会命中查询缓存。当查询返回实体实例时(例如您问题的两个查询),查询缓存仅存储查询返回的根实体的 ID。它不会缓存整个结果。 Hibernate 将尝试使用缓存的 ID 一个一个地获取集合中的所有实体。为了提高效率,目标实体也应该在实体缓存中。

因此,如果要执行查询以递归方式返回实体及其所有关联,则应使查询可缓存,使 ToMany 关联可缓存,并使图的每个实体都可缓存。

关于hibernate - 使用 Hibernate 和 EhCache 缓存集合时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7133568/

相关文章:

java - Hibernate 查询返回错误的日期

java - 事务不会回滚@Hibernate

java - 一对多关联的二级缓存

java - 使用 getKeysWithExpiryCheck() 方法时 ehcache keySet 超时

spring - 另一个未命名的 CacheManager 已存在于同一虚拟机中(ehCache 2.5)

java - Spring - Hibernate 使用 FlushMode 提高事务性能

java - 在 Hibernate 中更新一对多字段

php - Symony2 控制台命令删除缓存文件夹,更改权限

algorithm - 实际的CPU缓存中使用了哪些缓存失效算法?

android - 如何将位图缓存到 native 内存中