Hibernate 更新二级缓存,而不是使其无效

Hibernate 更新二级缓存,而不是使其无效,hibernate,hazelcast,Hibernate,Hazelcast,我们使用Hibernate 3.5.6和Hazelcast 3.6.1作为二级缓存。我们有以下问题。我们有一个具有非惰性集合的Hibernate实体。在同一节点上的两个连续会话中将元素添加到集合时,始终从数据库重新加载整个集合。我本以为,当一个元素添加到集合中时,二级缓存可以被更新,而不是将其从缓存中完全移出,并在每次添加另一个条目时重新加载它。这是Hibernate二级缓存的主要问题,还是我们这边的配置问题?默认情况下,Hibernate缓存是按PK键设置的,因此当您执行findAll()时,

我们使用Hibernate 3.5.6和Hazelcast 3.6.1作为二级缓存。我们有以下问题。我们有一个具有非惰性集合的Hibernate实体。在同一节点上的两个连续会话中将元素添加到集合时,始终从数据库重新加载整个集合。我本以为,当一个元素添加到集合中时,二级缓存可以被更新,而不是将其从缓存中完全移出,并在每次添加另一个条目时重新加载它。这是Hibernate二级缓存的主要问题,还是我们这边的配置问题?

默认情况下,Hibernate缓存是按PK键设置的,因此当您执行findAll()时,它将不使用Hibernate缓存,而当您执行findOne(id)时,它将使用Hibernate缓存


如果要缓存findAll(),我会使用ehcache和@cache注释,请注意它用于缓存的键。看

我想我自己能回答这个问题。事实上,Hibernate不会更新集合,但总是使其无效。我在这里找到了以下解释:

缓存语义是什么?关键的一点是集合永远不会在缓存中更新;它们只在缓存中失效,然后可能在以后的另一次数据库读取中再次缓存。因此,如果应用程序名为Group.addMember(),Hibernate将从缓存中删除该组的成员资格集合。如果JBoss Cache是第二级缓存实现,那么移除将在集群中传播;集合将从群集中所有节点的缓存中删除

如果以后应用程序需要访问该组中的成员,则会发生另一次数据库读取,并且成员的当前主键集将被放入缓存中


这可能和缓存的容量有关。你查过了吗。。。0 0 LRU 5000 25 100。。。我相应地更改了配置,但它没有更改行为问题是我们想要向集合中添加一个元素。Hibernate将始终加载整个集合,以便向其中添加元素。现在的问题是,如果无法从二级缓存加载集合(在本例中我不理解),它将始终查询数据库以加载整个集合。@janscheefer correct您必须自己扮演此缓存的角色。我很高兴被证明是错的,但我已经经历了与你完全相同的问题很多次。