Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AppEngine数据存储:“;id为的对象。。。由不同的对象管理器管理”;_Java_Google App Engine - Fatal编程技术网

Java AppEngine数据存储:“;id为的对象。。。由不同的对象管理器管理”;

Java AppEngine数据存储:“;id为的对象。。。由不同的对象管理器管理”;,java,google-app-engine,Java,Google App Engine,我使用的是谷歌AppEngine和Java。当我使用某些数据存储功能时,会收到一条错误消息: Object with id "edvaltt.Teacher@64064b" is managed by a different Object Manager 我不知道这意味着什么,也不知道如何修复它,也不知道在哪里可以找到关于这个错误的文档。有人能帮我吗?我使用的代码是: @PersistenceCapable(identityType = IdentityType.APPLICATION) pu

我使用的是谷歌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;
}
@PersistenceCapable(identityType=identityType.APPLICATION)
公立学校{
@主键
@持久性(valueStrategy=IdGeneratorStrategy.IDENTITY)
私有字符串短名称;
@持久的
私有字符串全名;
@持久的
@订单(extensions=@Extension(vendorName=“datanucleus”,key=“list ordering”,value=“code asc”))
私人名单教师;
...
公共教师FindOrCreateTacher(字符串代码)
{
//我们能找到没有任何数据库代码的老师吗?
教师newTeacher=findtteacher(代码);
if(newTeacher!=null)
回归新教师;
//创建教师:
PersistenceManager pm=PMF.get().getPersistenceManager();
事务tx=pm.currentTransaction();
试一试{
tx.begin();
适用于(教师:教师){
if(teacher.getCode()==code){
tx.回滚();
归国教师;
}
}
新教师=新教师(代码);
教师。添加(新教师);
pm.makePersistent(新教师);
总理(教师),;
tx.commit();
}最后{
tx.commit();
}
回归新教师;
}
我相信“
私人列表教师;
”指的是“拥有的,一对多”关系。

如中所示,您是否应该关闭pm(
PersistenceManager


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

由于您没有定义消息来自何处,因此不能再多说了。DataNucleus日志条目将告诉您更多信息

关闭PM始终是一件必须做的事情(除非您希望资源泄漏)

DataNucleus

感谢您提供的
pm.close();
提示。 我在问一个问题

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


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

我最初认为这已经解决了我的问题,但事实并非如此。首先,我仍然不知道发生了什么,为什么需要关闭持久性管理器,或者何时应该关闭。其次,AppEngine文档鼓励使用单例PersistenceManager的模式,以及pm.close()将意味着在流程的剩余部分,您不能再使用Google数据存储做任何事情。使用PMF的Singleton模式,而不是pm.pm.close()而不是PMF.close()的Singleton模式你能进一步向我解释什么是PM实例的合适生存期吗?假设我正在编写一个web应用程序。我应该在每个页面请求时打开和关闭它吗?还是在进程的生存期内保持一个实例打开?(如果我提交事务但不关闭PM,这是否意味着发生的最坏情况是内存泄漏?我的意思是,我的数据是安全的?)进程需要多长时间?典型的web系统会对每个请求使用PM。创建PM并不昂贵(创建PMF很昂贵)。如果使用txns,则您可以安全地将PM保持打开状态…只要您没有对该PM执行非事务性更新。
} finally {
    tx.commit();
    pm.close();
}
JDOHelper.getPersistenceManager(obj);