7

オブジェクトを作成し、そのオブジェクトが保持する外部コレクションのメンバーに1回の操作でデータを入力しようとしています。私は考えられるすべての操作の順序を試しましたが、それを機能させることができないようです。

私のクラスは(無関係なフィールドと注釈をスキップする)です:

@DatabaseTable
public class ScheduledJob
{
    @DatabaseField(id=true)
    private String id = UUID.randomUUID ().toString ();

    @ForeignCollectionField(eager=true)
    private Collection<ScheduledJobTask> tasks;

    /* other stuff here ... */
}

@DatabaseTable
public class ScheduledJobTask
{
    @DatabaseField(id=true)
    private String id = UUID.randomUUID ().toString ();
    @DatabaseField(foreign=true)
    private ScheduledJob job;
    /* more other stuff ... */

    public ScheduledJobTask(Task t) { 
       /* initialise scheduled task from template task by copying relevant fields...*/ 
    }

}

このようにしてオブジェクトを作成します。

ScheduledJob job = new ScheduledJob ();
// fill in other fields of job here
job.tasks = new ArrayList<ScheduledJobTask> ();
for (Task t : template.getTasks())
    job.tasks.add(new ScheduledJobTask(t));

sched.getSchedule().add (job);  // 'sched' is an object loaded from another table, this
                                // adds 'job' to a foreign collection in that table
Storage.store.scheduledJobs.createIfNotExists (job);
for (ScheduledJobTask t : job.getTasks ())
    Storage.store.scheduledJobTasks.createIfNotExists (t);
Storage.store.daySchedules.update (sched);

最後の3つのステートメントのすべての順序を試しましたが、何も機能していないようです。いずれの場合も、scheduledjobtaskデータベーステーブルに含まれるエントリの「job_id」フィールドはnullです。

私が間違ったことをしたアイデアはありますか?

4

1 に答える 1

3

Task.job足りないのは、フィールドを設定していないということです。フィールドは、外国のScheduledJobTask.jobコレクションを設定するものです。を取得するJobと、タスクテーブルを調べて、そのジョブを持つすべてのタスクを見つけます。その逆ではありません。

次のようなことをする必要があります。

for (Task t : template.getTasks()) {
    t.setJob(job);
    job.tasks.add(new ScheduledJobTask(t));
}

次に、これを行うと:

Storage.store.scheduledJobs.createIfNotExists (job);

すべてのjobフィールドにJobは、idフィールドが設定されたがあります。したがって、タスクを永続化すると、それらのジョブフィールドにはそのジョブIDが含まれます。

于 2013-02-11T20:20:41.037 に答える