У меня есть приложение struts2 с весенними транзакциями и JPA2 поверх гибернации. Проблема в том, что у меня есть несколько строк в базе данных, которые изменены внешним источником (некоторые триггеры mysql), и в моем фронт-приложении у меня есть ajax-скрипт, который проверяет это значение каждые 2 секунды. Мне всегда нужно получать последнее значение, а не кэшированное, и для этого я нашел 2 решения:
String sql = "FROM MyEntity WHERE xId=:id AND connect!=0 AND complete=0 AND (error=NULL OR error=0)";
Query q = this.em.createQuery(sql).setHint("org.hibernate.cacheable", false).setParameter("agId", agentId);
rs = q.getResultList();
if(rs.size() == 1){
intermedObj = (Intermed) rs.get(0);
}
и другие:
String sql = "FROM MyEntity WHERE xxId=:id AND connect!=0 AND complete=0 AND (error=NULL OR error=0)";
Query q = this.em.createQuery(sql).setParameter("agId", agentId);
rs = q.getResultList();
if(rs.size() == 1){
intermedObj = (Intermed) rs.get(0);
//get latest object from DB
em.refresh(intermedObj);
}
em - это экземпляр EntityManager
, который управляется пружиной.
Итак, вопрос в том, какой из этих двух подходов наилучший? Или, может быть, есть лучший?
Так что вы правы, я использовал там hql, мне еще нужно многое узнать о hibernate jpa и java в целом. Итак, я думаю, что правильный способ написания этой трески на JPQL будет:
String sql = "SELECT m FROM MyEntity m WHERE m.xxId=:id AND m.connect!=0 AND m.complete=0 AND (m.error!=1)";
Query q = this.em.createQuery(sql).setParameter("agId", agentId);
rs = q.getResultList();
if(rs.size() == 1){
intermedObj = (Intermed) rs.get(0);
//get latest object from DB
em.refresh(intermedObj);
}
Так что вопрос в том, является ли это правильным способом убедиться, что я получил последнюю строку из БД, а не кэшированную запись?
Что касается вопроса о кэше leve2, я не знаю, активирован ли он. Как мне это проверить?