2

エンティティ マネージャに問題があります。1 つのデータベースに約 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() を使用するかは問題ではありません。

私が使う:

グラスフィッシュ: 3.1.2.2

JPAプロバイダー: EclipseLink 2.5、JPA 2.1

PostgreSQL 9.1

JDK1.7

どうすればいいの?

4

1 に答える 1

1

Problem was the FetchType in my mapping:

@JoinFetch(value = JoinFetchType.INNER)

I expected that the value cannot be null/ 0, so FetchType.OUTER solved the issue:

@JoinFetch(value = JoinFetchType.OUTER)
于 2013-10-11T11:19:13.590 に答える