2015-07-21 96 views
0

我確保幾次閱讀有關此主題的文檔,但似乎無法將其包圍。我有一個名爲Home的模型,其ForeignCollectionPerson使用ForeignCollections更新和刷新實體時發生ORMLite問題

Home.class

public class Home implements Serializable{ 

    @DatabaseField(id = true, canBeNull = false, columnName = "id") 
    private long id; 

    @ForeignCollectionField(eager = true, maxEagerLevel = 2) 
    private Collection<Person> persons = new ArrayList<>(); 

    //constructors, getters, and setters... 
} 

Person.class

public class Person { 
    @DatabaseField(id=true, canBeNull = false, columnName = "id") 
    private long id; 

    @DatabaseField(foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true) 
    private Home home; 
    //constructors getters setters and other properties that are not important for this question 
} 

現在,經過最初值插入我的HomePerson模型,我能有什麼,看起來像這樣:

Home對象

{ 
    "id" : 1, 
    "persons" : [{"id" : 1}, {"id" : 2}, {"id" : 3}] 
} 

現在我不想從Person模型更新persons字段的內容。我只想更新Home對象的persons字段。

我已經試過如下:

home.setPersons(newArrayOfPersons); //this array is the same array except I removed one element. 
homeDao.update(home); 

上面的代碼沒有拋出任何錯誤,但它似乎沒有要更新我的SQLite數據庫。

然後我試圖使用UpdateBuilder

UpdateBuilder<Home, Long> updateBuilder = homeDao.updateBuilder(); 
updateBuilder.where().eq("id", home.getId()); 
updateBuilder.updateColumnValue("persons", newArrayOfPersons); 
updateBuilder.update(); 
homeDao.refresh(home); 

不幸的是,這一次把我約我怎麼能不更新的字段是國外收藏例外。

我在做什麼錯?

回答

0

好吧,我今天吃了一些食物,可能與我爲什麼能解決這個問題有直接關係。早餐後,文檔更有意義,事實證明我做的都是錯的。由於PersonHome的外部集合,因此它保留一個映射回父級的外鍵......所以我對Foreign集合進行了更新,而對VOILA進行了更新!

而不是做這個的:

UpdateBuilder<Home, Long> updateBuilder = homeDao.updateBuilder(); 
updateBuilder.where().eq("id", home.getId()); 
updateBuilder.updateColumnValue("persons", newArrayOfPersons); 
updateBuilder.update(); 
homeDao.refresh(home); 

我這樣做,而不是:

UpdateBuilder<Person, Long> updateBuilder = personDao.updateBuilder(); 
updateBuilder.where().in("id", arrayOfIdsOfPersons); //I just got all the ids of each object I want to update 
updateBuilder.updateColumnValue("home_id", secondHome); //changed the mapping to point to another `Home Object` 
updateBuilder.update(); 

homeDao.refresh(secondHome); //not sure if I need this one though. 

此外,我不得不改變我的孩子的屬性,這些屬性指定的外鍵註解我的父母模型,並添加了columnName = "home_id"

希望t他是有道理的,並在未來幫助任何人。