0

DAO実装ですべてのエンティティをリストとして取得した後、必要に応じてjavax.jdo.JDODetachedFieldAccessExceptionが発生し、エンティティから1つの属性オブジェクトを要求します。

public List<T> findAll() {
    this.entityManager = SingletonEntityManagerFactory.get().createEntityManager();
    EntityTransaction tx = this.entityManager.getTransaction();
    try {
      tx.begin();
    return this.entityManager.createQuery(
        "select f from " + clazz.getName() + " as f").getResultList();

    }finally {
      tx.commit();
      if (tx.isActive()) {
        tx.rollback();
      }
      this.entityManager.close();
    }

  }

たとえば、T が既に永続化されたエンティティであるクラス A のプロパティを持っていると仮定すると、List を取得した後に A を取得することはできません。

しかし、ID で単一のエンティティのみを検索する場合、この問題は発生しません。エンティティを取得し、その属性オブジェクトが既に永続化されているかどうかを問題なく要求できます

public T getById(final Key id) {
   return getEntityManager().find(clazz, id);
}

今、私はできる

A a= t.getA();

このエラーを回避するように findAll() の実装を作成するにはどうすればよいですか? EntityManagerの代わりに別のコンポーネントでしょうか?特定の種類のエンティティに対して特定のコードを実装する必要がなく、汎用的にするにはどうすればよいですか?

4

1 に答える 1

0

そこで行うことは、そのメソッドを終了する前にフィールドがロードされていることを確認しないため、フィールドにアクセスするか、デフォルトでフェッチされることを確認してください。

于 2012-09-07T08:18:06.493 に答える