0

我有 javax.jdo.JDODetachedFieldAccessException,当我想在我的 DAO 实现中将我的所有实体作为列表检索后,从我的实体中请求一个属性对象。

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 回答