我正在使用带有 JPA 的 SEAM(实现为 Seam Managed Persistance Context),在我的支持 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();
}
重新执行查询,这只是返回我已经拥有的相同数据(我假设它使用的是一级缓存而不是访问数据库)
@Override
public List<ItemStatus> refreshList(){
itemStatusDAO.refresh(itemList)
}
调用entityManager.refresh()
,这应该从数据库中刷新,但是javax.ejb.EJBTransactionRolledbackException: Entity not managed
当我使用它时会出现异常,通常我会entityManager.findById(entity.getId)
在调用 .refresh() 之前使用以确保它连接到 PC,但是当我刷新实体集合时,我不能这样做。
这似乎是一个非常简单的问题,我不敢相信没有办法强制 JPA/hibernate 绕过缓存并命中数据库?!
更新测试用例:
我正在使用两个不同的浏览器(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));
}
}
}