我有一个带有spring事务的struts2应用程序和带有hibernate的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
的一个实例,由spring管理。
所以,问题是:哪个是这两个方法的最佳方法?或者也许有一个更好的?
所以你是对的,我在那里使用了hql,我仍然需要学习很多关于hibernate jpa和java的知识。所以我想在JPQL中编写该cod的正确方法是:
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);
}
所以问题是,这是确保我从DB获得最新行而不是缓存记录的正确方法吗?
关于leve2缓存问题,我不知道这是否被激活。我该如何检查?