我们将Hibernate 3.5.6与Hazelcast 3.6.1一起用作二级缓存。我们有以下问题。我们有一个非惰性集合的Hibernate实体。在同一节点上的两个连续会话中向集合添加元素时,始终从数据库重新加载整个集合。我希望第二级缓存可以在将一个元素添加到集合时更新,而不是从缓存中完全逐出它并每次重新加载它以添加另一个条目。这是Hibernate二级缓存的主要问题,还是我们这方面的配置问题?
答案 0 :(得分:0)
默认情况下,hibernate缓存是在PK上键入的,因此当你执行findAll()时,它不会使用hibernate缓存,当你执行findOne(id)时它会。
如果你想缓存findAll()我会使用ehcache和@Cache annoations,小心它用于它的缓存的密钥。见http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html
答案 1 :(得分:0)
我想我可以自己回答这个问题。事实上,Hibernate将不更新集合,但始终使其无效。我在这里找到了以下解释:http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache:
什么是缓存语义?那么,关键的一点是集合永远不会在缓存中更新;它们仅在缓存中失效,然后在另一个数据库读取的结果后可能再次缓存。因此,如果一个名为Group.addMember()的应用程序,Hibernate将从缓存中删除该组的成员资格集合。如果JBoss Cache是二级缓存实现,那么该删除将在集群周围传播;该集合将从集群中所有节点的缓存中删除。
如果以后应用程序需要访问该组中的成员,则会发生另一个数据库读取,并且成员的当前主键集将被放入缓存中。