2013-10-10 29 views
2

我與實體管理器有問題。我想在一個數據庫中插入大約4000個對象。在插入語句之後,我希望所有元素都返回進行進一步處理。問題是我只得到1700個對象。實體管理器不返回像插入的所有元素

這是服務:

public void addAllElementsToDatabase() { 

    System.out.println("### listObjects: " + listObjects.size()); 

    for (Object object : listObjects) { 
     objectDAO.create(object); 
     // objectDAO.edit(object); 
    } 

    System.out.println("### listObjects after: " + objectDAO.findAll().size()); 
    System.out.println("### count rows: " + objectDAO.count()); 
} 

ObjectDAO從GenericDAO延伸。 GenericDAO樣子:

private Class<T> entityClass; 

public GenericDAO(Class<T> entityClass) { 
    this.entityClass = entityClass; 
} 

protected abstract EntityManager getEntityManager(); 

public void create(T entity) { 
    getEntityManager().persist(entity); 
} 

public void edit(T entity) { 
    getEntityManager().merge(entity); 
} 

public int count() { 
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
    javax.persistence.criteria.Root<T> rt = cq.from(entityClass); 
    cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
    javax.persistence.Query q = getEntityManager().createQuery(cq); 
    return ((Long) q.getSingleResult()).intValue(); 
} 

public List<T> findAll() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
} 

輸出:

INFO: ### listObjects: 4182 
INFO: ### listObjects after: 1711 
INFO: ### count rows: 4182 

pgAdmin3也表明了我4182行。如果我在控制檯中用SQL語句對行進行計數,我也會得到數字4182,但是我沒有在列表中獲得所有4182個元素。無論我使用edit()還是create(),都沒關係。

我用:

Glassfish的:3.1.2.2

JPA提供商:的EclipseLink 2.5,JPA 2.1

的PostgreSQL 9.1

JDK 1.7

怎麼能這樣呢?

+0

是什麼意思_but我不要在列表中獲得全部4182個元素? – perissf

回答

1

問題是FetchType在我的映射:

@JoinFetch(value = JoinFetchType.INNER) 

我預期該值不能爲空/ 0,所以FetchType.OUTER解決該問題:

@JoinFetch(value = JoinFetchType.OUTER)