当前位置: 首页 > 面试题库 >

AppEngine数据存储区:“ ID为…的对象由其他对象管理器管理”

岑俊明
2023-03-14
问题内容

我正在使用带有Java的Google AppEngine。当我使用某些数据存储功能时,出现一条错误消息:

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;”是指“拥有的,一对多”的关系。


问题答案:

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

JDOHelper.getPersistenceManager(obj);

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

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



 类似资料:
  • 内核对象管理接口 结构体 struct   rt_object   内核对象基类控制块 更多...   struct   rt_object_information   内核对象信息 更多...   宏定义 #define  RT_OBJECT_FLAG_MODULE   0x80   动态模块对象标志   类型定义 typedef struct rt_object *  rt_object_t

  • OpenStack对象存储是一个分布式的对象存储平台,支持API调用。该功能可以直接结合进其他应用中,也可以用来存储各种文件,包括虚拟机镜像、备份、归档、甚至是媒体文件。在OpenStack控制台,用户暂时只能管理容器和镜像。 在OpenStack对象存储中,容器是存放对象文件的空间,就像Windows或者Linux的文件夹是存放文件的空间一样。只是容器和容器不能像文件夹一样嵌套。OpenStac

  • Navicat 还能让你管理其他 SQLite 对象:索引和触发器。在主窗口的主工具栏点击相应的按钮来打开对象列表。

  • Navicat 还能让你管理其他 SQL Server 对象:索引、同义词、触发器、备份设备、链接服务器、服务器触发器、程序集、数据库触发器、分区函数和分区方案。在主窗口中,点击 “其他”,然后选择一个对象来打开对象列表。

  • Navicat 还能让你管理其他 PostgreSQL 对象:聚合、转换、域、索引、运算符、运算符类别、序列、触发器、表空间、编制和语言。在主窗口中,点击 “其他”,然后选择一个对象来打开对象列表。

  • Navicat 还能让你管理其他 Oracle 对象:数据库链接、索引、Java、实体化视图日志、序列、同义词、触发器、类型、XML 架构、目录、公用数据库链接、公用同义词和表空间。在主窗口中,点击 “其他”,然后选择一个对象来打开对象列表。