makePersistent将元素附加到我的列表而不是替换列表

时间:2010-10-26 17:29:50

标签: google-app-engine google-cloud-datastore jdo composition

我正在使用带有JDO的GAE数据存储来保存课程信息。每个课程都有一个GradeDefinition对象列表(例如“A = 90%+”,“B = 80%+”等)

当我尝试更改List时,新元素只是简单地附加在旧元素后面。我怀疑我使用可拆卸对象和持久性管理器的方式存在问题。

基本纲要:

@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. 使用

    准备我的新GradeDefinition列表

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

  3. 通过调用course.getGradingPolicy.setGradeDefinitions(newDefinitions);

  4. 重置列表
  5. 通过致电persistenceManager.makePersistent(course);
  6. 来保留更改

    但是,如果评分政策最初包含A,B和C,它现在可以保存A,B,C,X和Y!

    清除列表需要做些什么吗?我是否需要手动删除旧的GradeDefinitions?

1 个答案:

答案 0 :(得分:1)

注意多个PersistanceManagers之间的不一致,或者更好的是,一次只有一个PersistanceManager浮动。