持久性管理器中的hashmap

时间:2010-02-13 18:45:28

标签: java google-app-engine persistence

所以我正在尝试使用servlet,过滤器等构建谷歌应用引擎。我有一个看起来像这样的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 个答案:

答案 0 :(得分:5)

您可以要求GAE将HashMap存储为Blob值,方法是添加JDO注释以将此字段标记为存储序列化:

@Persistent(序列= “真”)

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

答案 1 :(得分:2)

它不是序列化支持的类型。您可以查看the list支持的类型,并考虑其他设计。我可能会遗漏一些东西,但你能不能保留支持或反对这个想法的用户群?布尔的目的是什么?请注意,HashSet是受支持的类型。

答案 2 :(得分:0)

私人地图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来获取所有用户的反应。