2009-10-29 12 views
10

Ich habe eine App in Google App Engine, die gut funktionierte. Ich erkannte, dass eines meiner JDO-erweiterten Objekte, die ich zu implementieren vergaß, gleich und hashCode war (ich muss das Objekt in einem Set verwenden). So tat ich. Ich habe bei diesen Implementierungen eigentlich nichts Besonderes gemacht, ich habe Eclipse nur benutzt, um sie zu erzeugen. Wie so:Google App Engine, JDO und equals/hashCode

@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; 
} 

So, jetzt, wenn ich versuche, alle URLs in der App zu treffen, wird diese Ausnahme ausgelöst:

/addUser javax.jdo.JDOUserException: Persistent Klasse „Class com. bpapa.myapp.domain.User scheint nicht verbessert worden zu sein. Möglicherweise möchten Sie den Enhancer erneut ausführen und nach Fehlern in der Ausgabe suchen. " hat keine Tabelle in der Datenbank, aber die Operation erfordert es. Bitte überprüfen Sie die Spezifikation der MetaData für diese Klasse. bei org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException (NucleusJDOHelper.java:427) bei org.datanucleus.jdo.JDOQuery.execute (JDOQuery.java:249) bei com.bpapa.myapp.servlet.AddUserServlet.doPost (AddUserServlet.java:34)

Irgendwelche Ideen, was ich falsch gemacht habe?

Antwort

11

Haben Sie Eclipse so eingestellt, dass der Datanucleus Enhancer automatisch ausgeführt wird? Was ist, wenn Sie versuchen, das Projekt mit Projekt-> Reinigen zu säubern und dann das Projekt von Grund auf neu zu erstellen?

+0

Doing die sauberen festen Dinge. – bpapa

14

Konfiguration in Eclipse ("den Datanucleus-Enhancer laufen" - damit verbundene Problem wie oben erörtert)

Projekteinstellungen -> Google -> App Engine -> ORM

ändern src parh "src /" Pfad zum genauen „src //“ Pfad der JDO-Klassen

+0

Das hat tatsächlich den Trick für mich getan. 10x! –

+0

Danke, es hat auch für mich funktioniert! – jmbouffard

+0

funktioniert wie ein Charme .. danke ... –

3

konfrontierte ich das gleiche Problem, und wenn ich das Projekt tat -> Sauber, sah ich im Protokoll folgende Ausnahme:

{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."} 

Also, ich entfernt:

C:/Documents and Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar 

aus dem Eclipse-Projekt, gereinigt und neu gebaut, alles begann wie erwartet funktioniert.

+0

Ich, was Log hast du das gesehen? – migueloop

0

Ich habe dieses Problem gelöst, indem ich auf die neueste Version von appengine Java sdk aktualisiert habe.