hashmap в менеджере сохраняемости - PullRequest
6 голосов
/ 13 февраля 2010

, поэтому я пытаюсь создать движок приложения Google, используя сервлеты, фильтры и т. Д. У меня есть файл Java, который выглядит примерно так:

public class Idea implements Comparator<Idea> {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private User author;

@Persistent
private String content;

@Persistent
private Date date;

@Persistent
private Map<User, Boolean> positiveVotes ;

@Persistent
private Map<User, Boolean> negativeVotes;

public Idea(User author, String content, Date date) {
    this.author = author;
    this.content = content;
    this.date = date;
    this.positiveVotes = new HashMap<User, Boolean>();
    this.negativeVotes = new HashMap<User, Boolean>();
}

, но когда я пытаюсь запустить свою программу, я получаюстек исключений, начинающийся с:

Feb 13, 2010 5:01:23 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /sign
java.lang.IllegalArgumentException: positiveVotes: java.util.HashMap is not a supported property type.
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:145)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:127)
at com.google.appengine.api.datastore.Entity.setProperty(Entity.java:280)

Итак, мой вопрос: почему он жалуется, что java.util.HashMap не является поддерживаемым типом свойства, а также что я мог сделать, чтобы обойти его?Спасибо!надеюсь, кто-то ответит в ближайшее время.

Ответы [ 3 ]

5 голосов
/ 08 декабря 2010

Вы можете попросить GAE сохранить HashMap в качестве значения Blob, добавив аннотацию JDO, чтобы пометить это поле как сериализованное для хранения:

@ Persistent (сериализовать = "истина")

https://code.google.com/intl/pl/appengine/docs/java/datastore/dataclasses.html#Serializable_Objects

2 голосов
/ 13 февраля 2010

Это не поддерживаемый тип для сериализации. Вы можете просмотреть список поддерживаемых типов и рассмотреть альтернативные варианты. Я мог бы что-то упустить, но можете ли вы просто оставить группу пользователей, которые поддерживают или противятся этой идее? Какова цель логического? Обратите внимание, что HashSet является поддерживаемым типом.

0 голосов
/ 28 февраля 2011

Частная карта PositiveVotes;

Сохранение хэш-карты для определения того, проголосовал ли пользователь или нет, может стать крайне неэффективным, если число пользователей станет большим.

почему вы не ведете такой класс:

class Votes {
private Key key;
private Key ideaId;
private User voter;
private Boolean positive; // true is positive, false is negative
}

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

Query query = pm.newQuery(Votes.class);
query.setFilter("ideaId == :ideaIdParam && user == :userParam");
List<Votes> userVotes = query.execute(ideaId, user);
if(userVotes != null && !userVotes.isEmpty()){
return userVotes.get(0).getPositive(); // this gives the users reaction
}
else {
return null; // this means no reaction
}

Теперь вы можете использовать это, чтобы получить реакцию конкретного пользователя или выполнить цикл по списку и получить реакции всех пользователей, удалив userParam из запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...