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

时间:2009-09-10 05:31:16

标签: java google-app-engine

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

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

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

3 个答案:

答案 0 :(得分:9)

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

JDOHelper.getPersistenceManager(obj);

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

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

答案 1 :(得分:3)

this ticket所示,你不应该关闭pm(PersistenceManager)吗?

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

答案 2 :(得分:2)

DataNucleus,

感谢您提供pm.close();小费。 我正在用一个em进行查询

  

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

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