I'm trying to create an object and populate members of a foreign collection held by that object in a single operation. I've tried every ordering of operations I can think of, and just can't seem to get it to work.
My classes are (skipping irrelevant fields and annotations):
@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...*/
}
}
I create my objects thus:
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);
I have tried all orderings of the last three statements, but nothing seems to work: in every case, the entries that end up in the scheduledjobtask database table have null for their 'job_id' field.
Any ideas what I've done wrong?
What you are missing is that you are not setting the Task.job
field. The ScheduledJobTask.job
field is what sets up the foreign collection. When you retrieve a Job
, it looks in the task table to find all of the tasks that have that job -- not the other way around.
You will need to do something like:
for (Task t : template.getTasks()) {
t.setJob(job);
job.tasks.add(new ScheduledJobTask(t));
}
Then, when you do this:
Storage.store.scheduledJobs.createIfNotExists (job);
all of the job
fields will have a Job
that has an id
field set. So when you persist your tasks, their job fields will have that job id.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With