Как Вы делаете результаты запроса доступными после закрытия менеджера по персистентности

Я изучаю GAE и вовлекаю немного. Если я использую следующее, с наконец, чтобы удостовериться, что менеджер персистентности закрывается, я получаю исключение при попытке на самом деле считать объекты Примечания:

public class Notes {
    public List<Note> getAll() {
    PersistenceManager pm = PMF.instance().getPersistenceManager();

    try {
        Query query = pm.newQuery("select from com.uptecs.google1.model.Note order by subject");
        return (List<Note>) query.execute();
    } finally {
        pm.close();
    }
    }
}

Исключение, которое я получаю, является этим:

Object Manager has been closed
org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed
    at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
    at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)
    at org.datanucleus.store.query.Query.getFetchPlan(Query.java:497)
5
задан Jacob 13 July 2010 в 23:01
поделиться

2 ответа

Попробуйте отсоединить объект от графа с помощью detachable="true":

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class Note {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long key;
...
}

Примечание: Я полностью понимаю необходимость этого, иногда вам нужно получить объекты и списки в контроллере, закрыть PM в контроллере, затем передать модели в представления. Пока мне не известны лучшие решения, я делаю это на JDO/GAE без проблем.

Список:

Мне кажется, что вам придется отсоединить все элементы в списке, если вы хотите иметь возможность использовать их после закрытия PM. Я бы использовал это для получения конкретных списков предметов. Полный getAll() может быть очень большим по размеру.

public List<Note> getList(){
    List<Note> detachedList=null, list=null;
    try {
        String query = "select from " + Note.class.getName();
        pm = PMF.get().getPersistenceManager();
        list = (List<Note>)pm.newQuery(query).execute();            
        detachedList = new ArrayList<Note>();
        for(Note obj : list){
            detachedList.add(pm.detachCopy(obj));
        }

    } finally {
        pm.close();
    }
    return detachedList;

}

По ключу:

public Note findByKey(Long key) {
    Note detachedCopy=null, object=null;
    try{
        pm= PMF.get().getPersistenceManager();
        object = pm.getObjectById(Note.class,key);
        detachedCopy = pm.detachCopy(object);
    }catch (JDOObjectNotFoundException e) {
        return null; // or whatever
    } 
    finally {
        pm.close(); // close here
    }
    return detachedCopy;

}

После закрытия у вас есть отделенная копия, с которой вы можете работать.

Ссылка: http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

9
ответ дан 13 December 2019 в 22:00
поделиться

Когда результат возвращается в списке - объекты извлекаются лениво (только когда вы их запрашиваете). Поскольку ваш постоянный менеджер закрыт, вы получаете исключение. «Отсоединяя» объекты, вы фактически говорите менеджеру постоянства о необходимости их быстрого извлечения.

1
ответ дан 13 December 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: