Подтвердить что ты не робот

Хранилище AppEngine: "Объект с идентификатором... управляется другим диспетчером объектов"

Я использую Google AppEngine с Java. Когда я использую некоторые функции datastore, у меня появляется сообщение об ошибке:

Object with id "[email protected]" 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;" относится к отношениям "принадлежащий, от одного до многих".

4b9b3361

Ответ 1

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

JDOHelper.getPersistenceManager(obj);

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

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

Ответ 2

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

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

Ответ 3

DataNucleus,

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

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

и совершить фиксацию с другим, не закрывая первый.