makePersistent добавляет элементы в мой список вместо замены списка

Я использую хранилище данных GAE с JDO для хранения информации о курсах. Каждый курс имеет список объектов GradeDefinition (например, «A=90%+», «B=80%+» и т. д.)

Когда я пытаюсь изменить список, новые элементы просто добавляются за старыми элементами. Я подозреваю, что проблема связана с тем, как я использую отделяемые объекты и менеджеры постоянства.

Основное изложение:

@PersistenceCapable(detachable = "true")
public class Course
{
    @Persistent(defaultFetchGroup = "true")
    private GradingPolicy gradingPolicy;
}

@PersistenceCapable(detachable = "true")
public class GradingPolicy
{
    @Persistent(defaultFetchGroup = "true")
    private List<GradeDefinition> gradeDefinitions;
}

@PersistenceCapable(detachable = "true")
public class GradeDefinition
{
    @Persistent
    private String gradeName; //e.g. "A", "B", etc.
}

Затем, когда я хочу обновить список объектов GradeDefinition в курсе, я:

  1. Получите объект курса (который автоматически получает свою GradingPolicy, которая автоматически получает список объектов GradeDefinition),
  2. Подготовьте мой новый список GradeDefinitions с

    List<GradeDefinition> newDefinitions = new ArrayList<GradeDefinitions>(); newDefinitions.add(new GradeDefinition("X")); //for example newDefinitions.add(new GradeDefinition("Y"));

  3. Сбросьте список, позвонив course.getGradingPolicy.setGradeDefinitions(newDefinitions);

  4. Сохраните изменения, вызвав persistenceManager.makePersistent(course);

Но если в политике классификации изначально были A, B и C, то теперь она содержит A, B, C, X и Y!

Есть ли что-то, что мне нужно сделать, чтобы очистить список? Нужно ли вручную удалять старые GradeDefinitions?


person Riley Lark    schedule 26.10.2010    source источник
comment
Это действительно было проблемой с отделяемыми сущностями и несколькими менеджерами постоянства. Я решил эту проблему, выполнив все операции с данными в течение срока службы одного менеджера постоянства.   -  person Riley Lark    schedule 28.10.2010


Ответы (1)


Следите за несоответствиями между несколькими PersistanceManager, или, что еще лучше, используйте только один PersistanceManager, плавающий одновременно.

person antony.trupe    schedule 11.01.2011