16

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

在数据库上似乎一切正常。身份证是正确的。有什么帮助吗?

用模型编辑


当我通过 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;
4

1 回答 1

25

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

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

引用文档foreignAutoRefresh

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

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

从文档中引用maxForeignAutoRefreshLevel

这可用于设置配置异物的最大级别数。例如,如果您有一个 Question 具有 best Answer 的外部字段,并且 Answer 具有对应问题的外部字段,则来回配置可能会变大。当您查找可能导致无限循环的问题时,这尤其是自动刷新字段的问题。默认情况下,ORMLite 只经过 2 个级别,但您可以将其减少到 1(0 无效)或增加它。当您加载问题时,数字越高,发生的数据库事务就越多。

如果您将其maxForeignAutoRefreshLevel增加到更多,那么它将发出额外的查询以刷新元素。

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true,
    maxForeignAutoRefreshLevel=3)
private EquipmentEntity equipment;
于 2013-01-22T19:09:06.740 回答