Google App Engine, JDO e equals / hashCode
-
10-07-2019 - |
Domanda
Ho un'app in Google App Engine che funzionava bene. Mi sono reso conto che uno dei miei oggetti potenziati con JDO che avevo dimenticato di implementare equals e hashCode (ho bisogno di usare l'oggetto in un set). Così ho fatto. Non ho fatto nulla di speciale in queste implementazioni, infatti ho usato Eclipse per generarle. In questo modo:
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String appleId;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((appleId == null) ? 0 : appleId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (appleId == null) {
if (other.appleId != null)
return false;
} else if (!appleId.equals(other.appleId))
return false;
return true;
}
Quindi ora, quando provo a colpire qualsiasi URL nell'app, viene generata questa eccezione:
/ addUser javax.jdo.JDOUserException: classe persistente " Class com.bpapa.myapp.domain.User non sembra essere stato migliorato. Potresti voler rieseguire il potenziatore e verificare la presenza di errori nell'output. & Quot; non ha una tabella nel database, ma l'operazione lo richiede. Controlla le specifiche dei MetaData per questa classe. at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException (NucleusJDOHelper.java:427) at org.datanucleus.jdo.JDOQuery.execute (JDOQuery.java:249) su com.bpapa.myapp.servlet.AddUserServlet.doPost (AddUserServlet.java:34)
Qualche idea su cosa ho fatto di sbagliato?
Soluzione
Hai eclissi impostato per eseguire automaticamente il potenziatore di datanucleus? Che cosa succede se provi a pulire il progetto con project- > clean e quindi a creare il progetto da zero?
Altri suggerimenti
Configurazione in eclipse (" esegui il datanucleus enhancer " - problema relativo come discusso sopra)
Impostazioni progetto - > Google - > App Engine - > ORM
Cambia src parh " src / " percorso dell'esatto " src // " percorso delle tue lezioni JDO
Ho affrontato lo stesso problema e quando ho fatto il Progetto - > Pulito, ho visto la seguente eccezione nel registro:
{Caused by: org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Documents%20and%20Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/C:/eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.4.2_1.4.2.v201102111811/appengine-java-sdk-1.4.2/lib/user/orm/datanucleus-appengine-1.0.8.final.jar."}
Quindi, ho rimosso:
C:/Documents and Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar
dal progetto eclipse, ripulito e ricostruito, tutto ha iniziato a funzionare come previsto.
Ho risolto questo problema aggiornando all'ultima versione di appengine java sdk.