我正在将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;
答案 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;