带有eclipse链接结果列表的JPA迭代到无穷大

时间:2012-06-23 09:15:24

标签: java jpa jpa-2.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)时,结果会循环到无穷大。

1 个答案:

答案 0 :(得分:1)

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

原因是getAllEMSDetails方法最后调用了getAllEMSDetails。它自称。所以改为当前的退货声明:

return getAllEMSDetails();

以下效果更好:

return emsDetails;