我有实体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来实现这项工作。
答案 0 :(得分:0)
对象C是否具有对象B的引用?
每个“集合存储”对象都必须引用将其放入集合的对象,否则ORMLite无法自动加载它。
答案 1 :(得分:0)
我创建对象A,然后我将其从数据库中拉出来。然后我实例化一个对象B,将它添加到A的集合中,并将变量“selectedB”设置为a。然后我更新A和B.
如果我理解这个问题,如果从数据库加载A
,B
内的A
集合看起来不错。但是,集合中每个C
内的B
个实体的集合为空。正确?
我认为你需要增加@ForeignCollectionField(maxEagerLevel = ...)
value。默认情况下,当您获得A
时,B
的热切集合是水合的,但不是B
热切的集合。做出这样的决定,因此对象没有递归,也没有产生大量的数据库请求。
通过增加maxEagerLevel
值,ORMLite将递归加载子集合。引用javadocs:
将此值设置为展开热切外国集合的外国集合的次数。如果你查询A并且它有一个渴望的字段B的外部集合,它有一个渴望的字段C ...的外部集合,那么每当你查询A时就会发生很多数据库操作。默认情况下这个值是1表示如果你查询A,那么B的集合将被急切地获取,但是每个B对象都将具有一个惰性集合而不是一个急切的C集合。只有当你知道自己在做什么时才应该增加它。