java - google - AppEngine datastore: "Objeto con id... es administrado por un Administrador de objetos diferente"
google app engine java 9 (3)
Como se ilustra en este ticket , ¿no debería cerrar el pm ( PersistenceManager
)?
} finally {
tx.commit();
pm.close();
}
Estoy usando Google AppEngine, con Java. Cuando uso algunas características del almacén de datos, recibo un mensaje de error:
Object with id "edvaltt.Teacher@64064b" is managed by a different Object Manager
No sé qué significa esto ni cómo solucionarlo ni dónde buscar documentación sobre este error. ¿Alguien puede ayudarme? El código que estoy usando es:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class School {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String shortname;
@Persistent
private String fullname;
@Persistent
@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="code asc"))
private List<Teacher> Teachers;
...
public Teacher FindOrCreateTeacher(String code)
{
// Can we find the teacher without any database code?
Teacher newTeacher = FindTeacher(code);
if (newTeacher != null)
return newTeacher;
// Create the teacher:
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
for (Teacher teacher : Teachers) {
if (teacher.getCode() == code) {
tx.rollback();
return teacher;
}
}
newTeacher = new Teacher(code);
Teachers.add(newTeacher);
pm.makePersistent(newTeacher);
pm.makePersistent(Teachers);
tx.commit();
} finally {
tx.commit();
}
return newTeacher;
}
Creo que los " private List<Teacher> Teachers;
" se refieren a una relación de "propiedad, uno para muchos".
DataNucleus,
Gracias por el pm.close();
propina. Estaba haciendo una consulta con un em
em = EMF.get().createEntityManager();
y hacer un commit con otro sin cerrar el primero.
Un objeto persistente solo puede ser "administrado" por un PersistenceManager. En DataNucleus esto es respaldado internamente por un "ObjectManager". El mensaje dice que está tratando de asociar un objeto administrado por un PM con un PM diferente. Puede depurar fácilmente imprimiendo el PM para cada objeto (persistente)
JDOHelper.getPersistenceManager(obj);
Como no define de dónde viene el mensaje, no se puede decir mucho más. Las entradas de registro de DataNucleus te dirían mucho más que eso.
Cerrar el PM siempre es una tarea esencial (a menos que desee fugas de recursos)