Хранилище данных AppEngine: «Объект с идентификатором ... управляется другим диспетчером объектов» - PullRequest
12 голосов
/ 10 сентября 2009

Я использую 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 ]

9 голосов
/ 07 октября 2009

Постоянный объект может управляться только одним PersistenceManager. В DataNucleus это поддерживается внутри «ObjectManager». В сообщении говорится, что вы пытаетесь связать объект, управляемый одним PM, с другим PM. Вы можете легко отладить это, распечатав PM для каждого (постоянного) объекта

JDOHelper.getPersistenceManager(obj);

Поскольку вы не определяете, откуда пришло сообщение, сказать больше нечего. Записи в журнале DataNucleus скажут вам гораздо больше.

Закрытие PM всегда важно (если вы не хотите утечки ресурсов)

3 голосов
/ 10 сентября 2009

Как показано в этом билете , разве вы не должны закрывать вечера (PersistenceManager)?

} finally {
    tx.commit();
    pm.close();
}
2 голосов
/ 22 ноября 2010

DataNucleus,

Спасибо за подсказку pm.close();. Я делал запрос с одним em

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

и выполнение коммита с другим без закрытия первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...