在我们的开发团队中,我注意到了两种使用EntityManager的方法:
1。第一种方式
public class ReferentielDaoImpl implements ReferentielDaoLocal {
@PersistenceContext(unitName = "ErpCCF-ejbPU")
private EntityManager em;
public List<Alerte> findAll(){
try {
em.getEntityManagerFactory().getCache().evictAll();
String req = "SELECT a FROM Alerte a ORDER BY a.idAlerte DESC";
List<Alerte> alertes = em.createQuery(req).getResultList();
return alertes;
} catch (Exception e) {
e.printStackTrace(System.out);
}
return null;
}
}
2.第二种方式
public class ReferentielDaoImpl implements ReferentielDaoLocal {
@PersistenceContext(unitName = "ErpCCF-ejbPU")
private EntityManager em;
public List<Alerte> findAll(){
try {
String req = "SELECT a FROM Alerte a ORDER BY a.idAlerte DESC";
List<Alerte> alertes = em.createQuery(req).getResultList();
return alertes;
} catch (Exception e) {
e.printStackTrace(System.out);
}
return null;
}
}
这两种方法有什么区别?
正确的方法是什么?
答案 0 :(得分:2)
EntityManagerFactory#getCache()
返回二级缓存,即所有EntityManager实例共有的缓存。 EclipseLink自动使用共享对象缓存,因此如果多个EntityManager查询同一个对象,则不必多次联系数据库。
通常,您可能必须逐出(=清除)二级缓存的唯一原因是您是否直接修改了数据库(例如,使用直接JDBC调用或任何其他不使用JPA持久性单元的进程)。如果情况并非如此,请不要逐出缓存 - 这将使其无效并减慢您的应用程序。
有关详细信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching