强制刷新集合 JPA 实体管理器
我将SEAM与JPA一起使用(作为Seam托管持久化上下文实现),在我的支持bean中,我将一个实体集合(ArrayList)加载到支持Bean中。
如果其他用户修改了不同会话中的某个实体,我希望将这些更改传播到会话中的集合,我有一种方法并尝试了以下方法...refreshList()
@Override
public List<ItemStatus> refreshList(){
itemList = itemStatusDAO.getCurrentStatus();
}
使用以下查询
@SuppressWarnings("unchecked")
@Override
public List<ItemStatus> getCurrentStatus(){
String s = "SELECT DISTINCT iS FROM ItemStatus iS ";
s+="ORDER BY iS.dateCreated ASC";
Query q = this.getEntityManager().createQuery(s);
return q.getResultList();
}
重新执行查询,这只会返回我已经拥有的相同数据(我假设它使用1st级缓存而不是命中数据库)
@Override
public List<ItemStatus> refreshList(){
itemStatusDAO.refresh(itemList)
}
调用 ,这应该从数据库刷新,但是当我使用它时,我得到一个例外,通常我会在调用.refresh()之前使用,以确保它连接到PC,但是由于我正在刷新实体集合,因此我无法做到这一点。entityManager.refresh()
javax.ejb.EJBTransactionRolledbackException: Entity not managed
entityManager.findById(entity.getId)
这似乎是一个非常简单的问题,我不敢相信没有办法强制JPA /休眠绕过缓存并命中数据库?!
更新测试用例:
我正在使用两个不同的浏览器(1和2)来加载相同的网页,我在1中进行了修改,该修改更新了其中一个ItemStatus实体中的布尔属性,视图刷新为1以显示更新的属性,我通过PGAdmin检查数据库并且该行已更新。然后,我在浏览器 2 中按刷新,但属性尚未更新
在调用 .refresh 之前,我尝试使用以下方法合并所有实体,但实体仍未从数据库中更新。
@Override
public void mergeCollectionIntoEntityManager(List<T> entityCollection){
for(T entity: entityCollection){
if(!this.getEntityManager().contains(entity)){
this.getEntityManager().refresh(this.getEntityManager().merge(entity));
}
}
}