在ForeignCollection中ORMLite Null ForeignCollection

时间:2013-11-21 17:17:32

标签: android ormlite

我有实体A,实体B和实体C.实体A具有实体B的外国集合和对当前选定的B的引用,并且B具有实体C的外部集合。每个实体都具有对实体C的引用。这是父母。

//A
@DatabaseField(columnName = COLUMN_SELECTED_B,
        foreign = true,
        foreignAutoRefresh = true,
        maxForeignAutoRefreshLevel = 3)
private B selectedB;

@ForeignCollectionField(columnName = COLUMN_BS,
        eager = true,
        maxEagerLevel = 3)
private ForeignCollection<GoalWeek> bs;


//B
@ForeignCollectionField(columnName = COLUMN_CS,
        maxEagerLevel = 2,
        eager = true)
private ForeignCollection<C> cs;

我创建对象A,然后我将其从数据库中拉出来。然后我实例化一个对象B,将它添加到A的集合中,并将变量“selectedB”设置为a。然后我更新A和B.

稍后当我拉动对象A时,急切地加载了selectedB。但是当我尝试将对象C添加到B内部的Cs集合时,Cs的集合总是为空。

我在这里做错了什么?

编辑:如果我加载实体A,然后获取所选B的ID,并加载它,一切都按预期工作,但这是一个巨大的麻烦。当然有一种方法可以通过加载A来实现这项工作。

2 个答案:

答案 0 :(得分:0)

对象C是否具有对象B的引用?

每个“集合存储”对象都必须引用将其放入集合的对象,否则ORMLite无法自动加载它。

答案 1 :(得分:0)

  

我创建对象A,然后我将其从数据库中拉出来。然后我实例化一个对象B,将它添加到A的集合中,并将变量“selectedB”设置为a。然后我更新A和B.

如果我理解这个问题,如果从数据库加载AB内的A集合看起来不错。但是,集合中每个C内的B个实体的集合为空。正确?

我认为你需要增加@ForeignCollectionField(maxEagerLevel = ...) value。默认情况下,当您获得A时,B的热切集合是水合的,但不是B热切的集合。做出这样的决定,因此对象没有递归,也没有产生大量的数据库请求。

通过增加maxEagerLevel值,ORMLite将递归加载子集合。引用javadocs:

  

将此值设置为展开热切外国集合的外国集合的次数。如果你查询A并且它有一个渴望的字段B的外部集合,它有一个渴望的字段C ...的外部集合,那么每当你查询A时就会发生很多数据库操作。默认情况下这个值是1表示如果你查询A,那么B的集合将被急切地获取,但是每个B对象都将具有一个惰性集合而不是一个急切的C集合。只有当你知道自己在做什么时才应该增加它。