Bulkupdate Cache问题? Hibernate / IntegrationTest / Inmemory DB /

时间:2016-08-09 07:45:35

标签: java hibernate jpa bulk

对于我的集成测试,我使用的是HSQLDB-Inmemory。

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

Entity.class

@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 [...]

@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

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

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

 @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 v 5.1.0.Final和HSQLDB v 2.3.4。 我假设这是一个Cache问题,有没有办法直接接收预期的结果而不调用每个实体的刷新?

1 个答案:

答案 0 :(得分:1)

  

持久化上下文未更新以反映   批量操作的结果。批量操作作为SQL针对数据库发出,绕过内存中的结构   持久化上下文。

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

  • 刷新实体
  • 逐出实体管理器中的所有缓存并强制它从头开始更新所有内容
  • 通过添加使批量操作在自己的事务中工作 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 方法签名。 (我不确定它将如何在春季实施,可能是@Transactional(propagation = Propagation.REQUIRES_NEW))