我的实体经理有问题。我想在一个数据库中插入大约4000个对象。在insert语句之后,我希望所有元素都返回进行进一步处理。问题是我只回来了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-Provider:EclipseLink 2.5,JPA 2.1
PostgreSQL 9.1
JDK 1.7
这怎么可能?
答案 0 :(得分:1)
问题是我的映射中的FetchType:
@JoinFetch(value = JoinFetchType.INNER)
我预计该值不能为null / 0,因此FetchType.OUTER解决了这个问题:
@JoinFetch(value = JoinFetchType.OUTER)