2010-02-13 8 views
6

그래서 필터가 내가 좋아하는 뭔가 보이는 자바 파일이 등, 서블릿을 사용하여 Google 앱 엔진을 구축을 위해 노력하고있다 :해시 맵

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>(); 
} 

을하지만 난 내 프로그램을 실행하려고하면, I 로 시작하는 예외 스택을 얻을 :

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에 지원되는 속성 유형이 아닌 불평 않으며, 또한 해결하기 위해 내가 무엇을 할 수 있는지 이유입니다. 감사! 누군가가 곧 대답하기를 바랍니다.

답변

2

직렬화에 지원되는 유형이 아닙니다. 지원되는 유형의 the list을 검토하고 대체 디자인을 고려해 볼 수 있습니다. 나는 뭔가를 놓칠 수 있지만, 그 아이디어를지지하거나 반대하는 사용자 집합을 유지할 수 있습니까? 부울의 목적은 무엇입니까? HashSet은 지원되는 형식입니다.

+0

내 수업에지도 입력란을 갖고 싶다면 어떻게해야합니까? – urfriend

+0

더 많은 코드를 보여 주거나 부울 값의 목적을 설명 할 수 있습니까? –

+0

실제로 해시 맵은 실제로 serializable http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html입니다. – urfriend

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을 제거하여 모든 사용자 반응을 얻을 수 있습니다.