【问题标题】:Hibernate caching stale data: many to many unidirectional mappingHibernate缓存陈旧数据:多对多单向映射
【发布时间】:2012-06-12 13:46:02
【问题描述】:

我有如下多对多关系(在库类型应用程序中):

User:    
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
        name = "user_book",
        joinColumns = {@JoinColumn(name = "fk_user")},
        inverseJoinColumns = {@JoinColumn(name = "fk_book")}
)
private List<Book> books = null;

Book:
@ManyToMany(cascade = {CascadeType.ALL}, 
            mappedBy = "books", fetch = FetchType.LAZY)
private List<User> users;

问题:当我编辑一本书的名称时,表中的值会更新,但是由于休眠缓存,用户对象仍然持有对旧书实体的引用。因此,虽然在后端我有正确的 Book 值,但在 UI 上我仍然看到陈旧的值。我正在使用 ehcache 并且还启用了二级缓存。 缓存配置:

<defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToLiveSeconds="120"
        overflowToDisk="false"
        diskPersistent="false"
        />
<cache name="org.hibernate.cache.UpdateTimestampsCache"
       maxElementsInMemory="10000"
       timeToIdleSeconds="300"
        />

<cache name="org.hibernate.cache.StandardQueryCache"
       maxElementsInMemory="10000"
       timeToIdleSeconds="300"
        />

我也在使用 OEMIV 过滤器。

【问题讨论】:

  • 你的问题到底是什么?缓存是如何配置的?您是否使用每个事务的会话?每会话会话?每个请求的会话?
  • 问题:我怎样才能让hibernate在我编辑它们后不缓存旧值?我启用了 OEMIV 过滤器。缓存配置如上(最近更新)
  • 你没有使关联可缓存,所以一定不能在二级缓存中。我们不知道您如何在 Book 实体上配置缓存。而且我们不知道您是如何编辑书名的:通过 Hibernate?相同的JVM?
  • 我通过休眠(来自同一个 JVM)编辑书的名称。没有为 Book 实体配置缓存。

标签: hibernate


【解决方案1】:

我认为你必须调用该方法

Flush()

这是因为您对一级或二级缓存所做的任何更改都将存储到缓存中,但是直到您刷新缓存后,数据才会真正存储到数据库中。

希望这会有所帮助!

【讨论】:

  • 我的缓存肯定会被刷新,因为我可以看到数据存储在数据库 (mysql) 中。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多