2010-02-13 15 views
6

así que estoy tratando de construir un motor de aplicación de Google utilizando servlets, filtros, etc. Tengo un archivo Java que se ve algo como:HashMap en gestor de persistencia

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

pero cuando trato de ejecutar mi programa, obtener una pila de excepción que comienza con:

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) 

lo tanto, mi pregunta es ¿por qué se quejan de que java.util.HashMap no es un tipo de bien apoyado, y también lo que podría hacer para trabajar alrededor de ella. ¡Gracias! Espero que alguien responda pronto.

Respuesta

2

No es un tipo admitido para la serialización. Puede revisar the list de los tipos admitidos y considerar diseños alternativos. Me podría estar perdiendo algo, pero ¿puedes mantener conjuntos de usuarios que apoyan u oponen la idea? ¿Cuál es el propósito del booleano? Tenga en cuenta que HashSet es un tipo compatible.

+0

Entonces, ¿qué puedo hacer si quiero tener un campo de mapa en mi clase? – urfriend

+0

¿Puedes mostrar más código o explicar el propósito del valor booleano? –

+0

realmente noté que hashmap es realmente serializable http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html. – urfriend

0

private Map positiveVotes;

Mantener un hashmap para ver si el usuario ha votado o no puede ser extremadamente ineficiente si la cantidad de usuarios aumenta.

¿Por qué no mantener una clase como esta:

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

y para cada idea simplemente consultar la tabla Votos para ver si el usuario ha votado a favor de la idea. si lo hizo fue positivo o negativo.

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 
} 

Ahora puede utilizar esto para conseguir una reacción usuarios en particular o un bucle sobre la lista y obtener todas las reacciones de los usuarios mediante la eliminación de la userParam de consulta.