【问题标题】:makePersistent is appending elements to my list instead of replacing the listmakePersistent 将元素附加到我的列表而不是替换列表
【发布时间】:2010-10-26 17:29:50
【问题描述】:

我正在使用 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 吗?

【问题讨论】:

  • 这确实是可分离实体和多个持久性管理器的问题。我通过在单个持久性管理器的生命周期内执行所有数据操作来解决它。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2020-09-02
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多