0

在我们的开发团队中,我注意到了两种使用 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;
    }
    }

这两种方法有什么区别?

正确的方法是什么?

4

1 回答 1

2

EntityManagerFactory#getCache()返回二级缓存,即所有EntityManager 实例通用的缓存。EclipseLink 自动使用共享对象缓存,因此如果多个 EntityManager 查询同一个对象,则不必多次联系数据库。

通常,您可能不得不驱逐(=清除)二级缓存的唯一原因是您直接修改了数据库(例如,使用直接 JDBC 调用或任何其他不使用 JPA 持久性单元的进程)。如果不是这种情况,请不要驱逐缓存 - 这将使其无用并减慢您的应用程序。

有关更多信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

于 2013-09-20T13:36:42.977 回答