JDO - HashMap во встроенном классе - PullRequest
1 голос
/ 25 мая 2011

Можете ли вы хранить HashMap во встроенном классе в App Engine? У меня есть следующий класс:

@Persistent(serialized = "true")
@Embedded
private Stats stats;

@PersistenceCapable
@EmbeddedOnly
public static class Stats implements Serializable {
    private static final long serialVersionUID = 1L;        
    @Persistent(serialized = "true", defaultFetchGroup="true")
    private Map<String, Integer> requests;

    public Stats() {
        requests = new HashMap<String, Integer>();
    }
}

Однако, когда я пытаюсь добавить элемент в HashMap и сохранить его, я получаю следующую ошибку:

Указанный класс class com.google.appengine.api.datastore.Blob не является постоянным

Я знаю, что вы можете успешно использовать HashMap в "нормальном" классе, но могут ли они быть использованы и во встроенном классе?

Спасибо

1 Ответ

0 голосов
/ 03 февраля 2012

Я не пробовал это с классом Embedded, но мои Карты внутри объектов JDO нуждались в дополнительных аннотациях FetchGroup для содержащего класса ...

    @SuppressWarnings("serial

        ")
        @PersistenceCapable(identityType=IdentityType.APPLICATION, detachable="true")
        @FetchGroup(name="QueryAggregationJobJDO", members={
                                                @Persistent(name="appName", recursionDepth=-1),
etc....                                         
        public class QueryAggregationJobJDO extends AggregationJobJDO implements SystemObject {
            @Persistent(serialized="true")  // this is string of app names and a count for each name found
            public Map< String, Long >  appName = new HashMap<String, Long>();

и нам пришлось добавить этот класс с помощью getFetchPlan () при открытии нашего DataManager ...

@Override
public boolean open() {
    DataAreaManager dataAreaManager = new DataAreaManager();
    dataAreaManager.setDataArea(VERSION_DATA_AREA);

    if ((pm == null) || (pm.isClosed())) {

        pm = PMF.get(type).getPersistenceManager();
        pm.getFetchPlan().addGroup("TouchActiveUserJDO");
        pm.getFetchPlan().addGroup("UserRoleJDO");
        pm.getFetchPlan().addGroup("QueryAggregationJobJDO");
...