2013-02-11 15 views
6

Sto provando a creare un oggetto e popolare i membri di una raccolta straniera detenuti da quell'oggetto in una singola operazione. Ho provato ogni ordine di operazioni a cui riesco a pensare, e proprio non riesco a farlo funzionare.ORMLite - come creare un oggetto e popolare la collezione straniera?

mie classi sono (saltando i campi irrilevanti e annotazioni):

@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...*/ 
    } 

} 

creo miei oggetti così:

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); 

Ho provato tutti ordinamenti degli ultimi tre affermazioni, ma nulla sembra lavoro: in ogni caso, le voci che finiscono nella tabella del database schedulejobtask hanno null per il loro campo 'job_id'.

Qualche idea su cosa ho fatto di sbagliato?

risposta

3

Quello che ti manca è che non stai impostando il campo Task.job. Il campo ScheduledJobTask.job è ciò che imposta la collezione straniera. Quando si recupera un Job, viene visualizzato nella tabella delle attività per trovare tutte le attività che hanno quel lavoro, non il contrario.

Avrete bisogno di fare qualcosa di simile:

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

Poi, quando si esegue questa operazione:

Storage.store.scheduledJobs.createIfNotExists (job); 

tutti i campi job avrà un Job che ha un set di id campo. Quindi, quando si persistono le attività, i loro campi di lavoro avranno quell'ID lavoro.

+0

Ah, grazie, supponevo che quei campi sarebbero stati impostati automaticamente quando l'oggetto è stato mantenuto. :) – Jules

+0

Se riesci a trovare un modo semplice per ORMLite di essere in grado di farlo, sono tutto orecchie @Jules. – Gray

Problemi correlati