ORMLite不加载子外部字段

时间:2013-01-22 10:38:54

标签: android ormlite

我正在将ORMLite 4.42用于Android应用。我有一个有外国领域的实体。这些字段也有外国字段。问题是,当我获得根实体的元素时,只加载第一级外部字段。其他级别为空。

在数据库上,每一个似乎都可以。 id是正确的。有什么帮助吗?

使用模型进行编辑


我通过ID查询设备模型始终为空。但如果我查询整个表格,那么它就可以访问所有内容。

表事故

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private UserEntity user;

@DatabaseField(dataType = DataType.DATE, canBeNull=true)
private Date date;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true)
private EquipmentEntity equipment;

桌子设备

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=false, unique=true)
private String serial;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentTypeEntity type;

表设备类型

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=true)
private String type;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentModelEntity model;

表设备型号

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=false)
private String model;

1 个答案:

答案 0 :(得分:25)

  

我正在将ORMLite 4.42用于Android应用。我有一个有外国领域的实体。这些字段也有外国字段。问题是,当我获得根实体的元素时,只加载第一级外部字段。其他级别为空。

是的,这是设计的。 ORMLite专门限制自动刷新子元素的次数。这样做是为了防止巨大的对象树吞噬内存和自我引用对象。

引用docs for foreignAutoRefresh

  

注意:为防止递归,有几个地方被自动刷新受到限制。如果要自动刷新一个本身具有foreignAutoRefresh设置为true的字段的类,或者如果要自动刷新具有外部集合的类,则在这两种情况下,结果字段将设置为null并且不会自动刷新。如果需要,您可以直接在该字段上调用刷新。

     

注意:如果您的自动刷新字段是一个也具有自动刷新字段的对象,您可能需要调整maxForeignAutoRefreshLevel值。见下文。

引用maxForeignAutoRefreshLevel的文档:

  

这可用于设置配置外部对象的最大级别数。例如,如果您的问题具有最佳答案的外部字段,并且答案具有相应问题的外部字段,则来回的配置可能会变大。当您查找可能导致无限循环的问题时,这尤其是自动刷新字段的问题。默认情况下,ORMLite仅通过2个级别,但您可以将其降低为1(0无效)或增加它。数字越大,加载问题时发生的数据库事务就越多。

如果将maxForeignAutoRefreshLevel增加到更多,则会发出额外查询以刷新元素。

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true,
    maxForeignAutoRefreshLevel=3)
private EquipmentEntity equipment;