dal*_*luq 3 caching hibernate ehcache
正如主题所暗示的那样,我在使用Hibernate和EhCache时遇到了一些麻烦.
我在Resteasy应用程序中使用Hibernate与mySql和EhCache.
模型:有一些实体,一些是一对多的,一些是一对一的关系.
问题:我试图在查询中获取所有数据createQuery("from Measuring c").list().现在有两种方法可以缓存结果:Querycache和2nd-level-cache.
querycache只会缓存测量实体的选择,不用说这不是我期望的行为.好吧,我希望querycache缓存所有的sql语句.有没有办法让这个工作?
我已经为所有实体激活了缓存.第二级缓存将缓存元素,但不会再次击中它们(确实如此,但只有测量元素); 稍后我意识到我必须缓存集合以让缓存知道哪些元素属于一起.
好吧,在将所有数据作为第一个缓存请求获取的情况下,激活所有一对多集合的缓存非常有效.但如果没有问题,我就不会写这个.通过其中一个字段查询某个地点作为第一个缓存操作将使缓存执行它应该执行的操作:它缓存所请求的数据,这意味着一个测量实体(实际上数据库中只有一个),一个标题信息,内容使用places-element和找到的地方及其子元素.查询另一个地方也很有效.现在我想获得所有元素(上面提到的查询),但我只得到已经查询过的元素.如果语句不包含选择标准,hibernate似乎只查询缓存.缓存集合时,这似乎是一个小问题.
所以我需要的是获取查询缓存以缓存所有语句,或者如果请求已经执行了具体的查询,则检索整个集合的第二级缓存.
我还必须提到,当检索一个具体的地方(或所有元素)时,我需要获得完整的测量元素(带有其标题信息等),因为休息服务在xml中回答而另一方需要得到具有所有可能节点的测量元件.
我可以想象,我的查询中有一些错误.所以这里有两个提到的查询:
获取所有数据: 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().
有谁能够帮我?
许多人提前感谢并亲切的问候
你的问题很难理解,所以我只是解释一下缓存是如何工作的.
你可以缓存三件事:
使用get或load时,以及通过ToOne关联从另一个实体导航到缓存实体时,将触发实体缓存.仅缓存实体的字段.不是ToMany协会.
导航通过缓存的ToMany关联时,将会遇到集合的缓存.缓存仅存储集合中实体的ID.Hibernate将尝试使用缓存的ID逐个获取集合的所有实体.为了有效,目标实体因此也应该在实体缓存中.
执行缓存查询时将触发查询缓存.当查询返回实体实例(例如问题的两个查询)时,查询缓存仅存储查询返回的根实体的ID.它不会缓存整个结果.Hibernate将尝试使用缓存的ID逐个获取集合的所有实体.为了有效,目标实体因此也应该在实体缓存中.
因此,如果要执行查询以递归方式返回其所有关联的实体,则应使查询可缓存,使ToMany关联可缓存,并使图形的每个实体都可缓存.
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |