2009-10-29 24 views
10

Tengo una aplicación en Google App Engine que estaba trabajando muy bien. Me di cuenta de que uno de mis objetos mejorados con JDO olvidé implementar equals y hashCode (necesito usar el objeto en un conjunto). Así que lo hice. Realmente no hice nada especial en estas implementaciones, de hecho acabo de usar Eclipse para generarlas. De este modo:Google App Engine, JDO, y es igual a/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; 
} 

Así que ahora, cuando trato de golpear a cualquier URL en la aplicación, esta excepción se tira:

/addUser javax.jdo.JDOUserException: Persistente clase "com clase. no parece bpapa.myapp.domain.User haber sido mejorada. Es posible que desee volver a ejecutar el potenciador y comprobar si hay errores en la salida ". no tiene tabla en la base de datos, pero la operación lo requiere. Por favor, compruebe la especificación de los metadatos para esta clase. en org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException (NucleusJDOHelper.java:427) en org.datanucleus.jdo.JDOQuery.execute (JDOQuery.java:249) en com.bpapa.myapp.servlet.AddUserServlet.doPost (AddUserServlet.java:34)

¿Alguna idea sobre lo que hice mal?

Respuesta

11

¿Se han establecido Eclipse para ejecutar automáticamente el potenciador DataNucleus? ¿Qué sucede si intenta limpiar el proyecto con project-> clean y luego crea el proyecto desde cero?

+0

Hacer las cosas fijas limpias. – bpapa

14

configuración en Eclipse ("ejecutar el promotor de DataNucleus" - tema relacionado como se mencionó anteriormente)

Configuración del proyecto -> Google -> App Engine -> ORM

Cambio src PARH "src /" ruta de acceso a la ruta exacta "src //" de sus clases JDO

+0

Eso realmente funcionó para mí. 10x! –

+0

¡Gracias también funcionó para mí! – jmbouffard

+0

funciona como un encanto .. Gracias ... –

3

que se enfrentó al mismo problema, y ​​cuando lo hice el Proyecto -> Limpio, vi excepción siguiente en el 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."} 

Así, quité:

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

del proyecto eclipse, limpiado y reconstruido, todo empezó a trabajar como se esperaba.

+0

que lo registro viste eso? – migueloop

0

He resuelto este problema mediante la actualización a la última versión del SDK de Google App Engine Java.