Я использую SEAM с JPA (реализованный как Контекст управляемого столкновений), в моем бэкэн-бэк-блоке я загружаю коллекцию сущностей (ArrayList) в бэк файл.
Если другой пользователь изменяет одно из объектов в другом сеансе, я хочу, чтобы эти изменения были распространены в коллекции в моем сеансе, у меня есть метод 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();
}
Повторное выполнение запроса, это просто возвращает те же самые данные, которые у меня уже есть (я предполагаю, что он использует кеш 1-го уровня, а не попадает в базу данных)
@Override
public List<ItemStatus> refreshList(){
itemStatusDAO.refresh(itemList)
}
Вызов entityManager.refresh()
, это должно обновляться из базы данных, однако я получаю javax.ejb.EJBTransactionRolledbackException: Entity not managed
исключение, когда я его использую, обычно я бы использовал entityManager.findById(entity.getId)
перед вызовом.refresh() чтобы он был прикреплен к ПК, но поскольку я обновляю набор объектов, которые я не могу сделать.
Кажется, это довольно простая проблема, я не могу полагать, что нет возможности заставить 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));
}
}
}