2012-06-23 37 views
0

我 命名查詢:JPA與Eclipse鏈接resultlist迭代到無窮遠

@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

不,列表不會迭代到無窮大。正如您從日誌中看到的那樣,for循環外部的logger.info(emsDetails.size())也會一次又一次地執行。

原因在於getAllEMSDetails方法的最後是調用getAllEMSDetails。它自稱。因此,而不是目前的return語句:以下

return getAllEMSDetails(); 

效果更好:

return emsDetails; 
+0

OWH神..........惡夢........我想我喝,做編碼 – kinkajou