AppEngine数据存储区:“具有id …的对象由不同的对象管理器管理”

我正在使用Google AppEngine和Java。 当我使用一些数据存储function时,我收到一条错误消息:

Object with id "edvaltt.Teacher@64064b" is managed by a different Object Manager 

我不知道这意味着什么或如何解决它或在哪里寻找有关此错误的文档。 谁能帮我? 我正在使用的代码是:

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

我认为“ private List Teachers; ”是指“拥有,一对多”的关系。

持久对象只能由一个PersistenceManager“管理”。 在DataNucleus中,这由“ObjectManager”内部支持。 该消息表明您正在尝试将由一个PM管理的对象与另一个PM关联。 您可以通过为每个(持久)对象打印PM来轻松调试它

 JDOHelper.getPersistenceManager(obj); 

由于您没有定义消息的来源,因此不能说更多。 DataNucleus日志条目会告诉您更多的方式。

关闭PM始终是必不可少的事情(除非您想要资源泄漏)

如此票证所示 ,你不应该关闭pm( PersistenceManager )吗?

 } finally { tx.commit(); pm.close(); } 

DataNucleus将,

谢谢你的pm.close(); 小费。 我正在用一个em进行查询

em = EMF.get().createEntityManager();

并且在没有关闭第一个的情况下与另一个提交。