首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新缓存问题?Hibernate / IntegrationTest / Inmemory DB /

更新缓存问题?Hibernate / IntegrationTest / Inmemory DB /
EN

Stack Overflow用户
提问于 2016-08-09 07:45:34
回答 1查看 53关注 0票数 0

对于集成测试,我使用的是内存中的HSQLDB。

当我通过jql查询执行大容量更新时,之后无法获得更新的结果。

Entity.class

代码语言:javascript
复制
@Entity
public class Entity {
   private Long id;
   private String someCriteria;
   private Boolean changed = Boolean.FALSE;

   @Id
   @Column (name = "ID")
   public Long getId() {
      return id;
   }

   @Column (name = "SOMECRITERIA")
   public String getSomeCriteria() {
      return someCriteria;
   }

   @Column (name = "CHANGED")
   @Type (type = "yes_no")
   public String isChanged() {
      return changed;
   }

   […]
}

DataStore.class…

代码语言:javascript
复制
@Transactional
updateChangedMethod() {
Query query = entityManager.get().createQuery(“UPDATE Entity e SET e.changed = true WHERE (d.someCriteria = ‘true’) ");
query.executeUpdate();
}

@Transactional
selectAllMethod() {
Query query = entityManager.get().createQuery("Select e from Entity e", Entity.class);
}
[…]

Service.class

代码语言:javascript
复制
 execute(){
        updateChangedMethod() ;
        selectAllMethod(); // Results do not contain the update
    }

当我显式地为每个实体执行刷新时,select按预期工作:

代码语言:javascript
复制
 @Transactional
    refresh(){
    Query query = entityManager.get().createQuery("Select e from Entity e",  Entity.class);
    List<Entity> result = query.getResultList();

    for (Entity entity : result) {
        entityManager.get().refresh(entity);
    }
    }


   execute(){
            updateChangedMethod() ;
            refresh();
            selectAllMethod(); // Results do contain the update
      }

我使用Hibernate v5.1.0. using和HSQLDBv2.3.4。我假设这是一个缓存问题,是否有一种方法可以直接接收预期的结果而不对每个实体进行刷新?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-09 23:31:55

不更新持久性上下文以反映大容量操作的结果。批量操作是针对数据库以SQL形式发出的,它绕过了持久性上下文的内存结构。

您有三种方法可以从实体管理器获得最新的结果:

  • 刷新实体
  • 退出实体管理器中的所有缓存,并强制它从一开始就更新所有内容。
  • 通过将@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)添加到方法签名中,使批量操作在它们自己的事务中工作。(我不确定它将如何在春季实现,可能是@Transactional(传播= Propagation.REQUIRES_NEW))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38844914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档