2013-02-11 30 views
6

मैं एक ऑब्जेक्ट बनाने और एक ही ऑपरेशन में उस ऑब्जेक्ट द्वारा आयोजित एक विदेशी संग्रह के सदस्यों को पॉप्युलेट करने की कोशिश कर रहा हूं। मैंने ऑपरेशन के हर आदेश की कोशिश की है जिसे मैं सोच सकता हूं, और इसे काम करने के लिए प्रतीत नहीं होता है।ORMLite - ऑब्जेक्ट कैसे बनाएं और विदेशी संग्रह कैसे बनाएं?

मेरे वर्गों (अप्रासंगिक क्षेत्रों और एनोटेशन लंघन) कर रहे हैं:

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

मैं पिछले तीन बयानों के सभी orderings की कोशिश की है, लेकिन कुछ भी करने लगता है कार्य: प्रत्येक मामले में, शेड्यूल किए गए जॉबटास्क डेटाबेस तालिका में समाप्त होने वाली प्रविष्टियां उनके 'job_id' फ़ील्ड के लिए शून्य होती हैं।

कोई विचार जो मैंने गलत किया है?

उत्तर

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 क्षेत्र सेट है कि होगा। तो जब आप अपने कार्यों को जारी रखते हैं, तो उनके नौकरी के क्षेत्र में वह नौकरी आईडी होगी।

+0

आह, धन्यवाद, मैं मान रहा था कि ऑब्जेक्ट जारी होने पर उन फ़ील्ड स्वचालित रूप से सेट हो जाएंगे। :) – Jules

+0

यदि आप ORMLite को ऐसा करने में सक्षम होने का एक आसान तरीका समझ सकते हैं, तो मैं सभी कान @ जुल्स हूं। – Gray