对于集成测试,我使用的是内存中的HSQLDB。
当我通过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 v5.1.0. using和HSQLDBv2.3.4。我假设这是一个缓存问题,是否有一种方法可以直接接收预期的结果而不对每个实体进行刷新?
发布于 2016-08-09 23:31:55
不更新持久性上下文以反映大容量操作的结果。批量操作是针对数据库以SQL形式发出的,它绕过了持久性上下文的内存结构。
您有三种方法可以从实体管理器获得最新的结果:
https://stackoverflow.com/questions/38844914
复制相似问题