2013-02-11 31 views
6

Tôi đang cố gắng tạo một đối tượng và cư trú các thành viên của một bộ sưu tập nước ngoài được tổ chức bởi đối tượng đó trong một thao tác đơn lẻ. Tôi đã thử mọi thứ tự của các hoạt động tôi có thể nghĩ đến, và dường như không thể làm cho nó hoạt động được.ORMLite - làm thế nào để tạo ra một đối tượng và cư trú bộ sưu tập nước ngoài?

lớp của tôi là (bỏ qua các lĩnh vực không liên quan và chú thích):

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

} 

tôi tạo các đối tượng của tôi như sau:

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

Tôi đã thử tất cả orderings của ba tuyên bố cuối cùng, nhưng không có vẻ công việc: trong mọi trường hợp, các mục nhập trong bảng cơ sở dữ liệu schedulejobtask có null cho trường 'job_id' của họ.

Bất kỳ ý tưởng nào tôi đã làm sai?

Trả lời

3

Điều bạn đang thiếu là bạn không đặt trường Task.job. Trường ScheduledJobTask.job là những gì thiết lập bộ sưu tập nước ngoài. Khi bạn truy xuất Job, nó sẽ tìm trong bảng nhiệm vụ để tìm tất cả các tác vụ có công việc đó - không phải theo cách khác.

Bạn sẽ cần phải làm một cái gì đó như:

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

Rồi, khi bạn làm điều này:

Storage.store.scheduledJobs.createIfNotExists (job); 

tất cả các lĩnh vực job sẽ có một Job rằng có một bộ id lĩnh vực. Vì vậy, khi bạn duy trì nhiệm vụ của mình, các trường công việc của họ sẽ có id công việc đó.

+0

Ah, cảm ơn, tôi đã giả định rằng các trường đó sẽ được đặt tự động khi đối tượng được duy trì. :) – Jules

+0

Nếu bạn có thể tìm ra một cách dễ dàng cho ORMLite để có thể làm điều đó, tôi là tất cả tai @ Jules. – Gray

Các vấn đề liên quan