0

我的命名查询:

@NamedQuery(name = "EmsDetails.findAll", query = "SELECT e FROM EmsDetails e")

private static Logger logger = Logger.getLogger(EmsDetailsDTO.class);
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("Employee_Mangement_SystemPU");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();


    public List<EmsDetails> getAllEMSDetails() {
        List<EmsDetails> emsDetails = em.createNamedQuery("EmsDetails.findAll").getResultList();
        logger.info(emsDetails.size());
        for(EmsDetails e : emsDetails){
            logger.info(e.getAddress());
        }

        return getAllEMSDetails();
    }

    public boolean addEmployee(EmsDetails detail){
        tx.begin();
        em.persist(detail);
        tx.commit();
        return true;        
    }

    public void closeEM(){
        em.close();
        emf.close();

    }

    public static void main(String[] args) {
        EmsDetailsDTO e = new EmsDetailsDTO();
        e.getAllEMSDetails();
    }

结果:

4:55:36,660  INFO EmsDetailsDTO:28 - 1
14:55:36,670  INFO EmsDetailsDTO:30 - I 
14:55:36,670  INFO EmsDetailsDTO:28 - 1
14:55:36,670  INFO EmsDetailsDTO:30 - I 
14:55:36,670  INFO EmsDetailsDTO:28 - 1
14:55:36,670  INFO EmsDetailsDTO:30 - I 

使用 JPA (eclipselink) 时,结果循环到无穷大。

4

1 回答 1

1

不,List 不会迭代到无穷大。正如您从日志中看到的,logger.info(emsDetails.size())for 循环之外的 也被一次又一次地执行。

原因是在getAllEMSDetails 方法的最后调用了getAllEMSDetails。它自称。所以改为当前的返回语句:

return getAllEMSDetails();

以下效果更好:

return emsDetails;
于 2012-06-23T10:24:41.573 回答