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

いいえ、リストは無限に繰り返されません。ログからわかるようにlogger.info(emsDetails.size())、forループの外側にあるも何度も実行されます。

理由は、getAllEMSDetailsメソッドの最後にgetAllEMSDetailsが呼び出されるためです。それはそれ自身を呼びます。したがって、代わりに現在のreturnステートメント:

return getAllEMSDetails();

以下の方がうまく機能します:

return emsDetails;
于 2012-06-23T10:24:41.573 に答える