【发布时间】: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 对象列表时,我:
- 获取课程对象(它会自动获取其 GradingPolicy,它会自动获取其 GradeDefinition 对象列表),
-
用
准备我的新的 GradeDefinitions 列表List<GradeDefinition> newDefinitions = new ArrayList<GradeDefinitions>(); newDefinitions.add(new GradeDefinition("X")); //for example newDefinitions.add(new GradeDefinition("Y")); 调用
course.getGradingPolicy.setGradeDefinitions(newDefinitions);重置列表- 通过调用
persistenceManager.makePersistent(course);来保持更改
但是,如果评分策略最初包含 A、B 和 C,那么它现在包含 A、B、C、X 和 Y!
我需要做些什么来清除列表吗?我需要手动删除旧的 GradeDefinitions 吗?
【问题讨论】:
-
这确实是可分离实体和多个持久性管理器的问题。我通过在单个持久性管理器的生命周期内执行所有数据操作来解决它。
标签: google-app-engine google-cloud-datastore jdo composition