ORMLite不加载子外部字段

crp*_*iro 16 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;
Run Code Online (Sandbox Code Playgroud)

表设备

@DatabaseField(generatedId=true)
private UUID id;

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

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentTypeEntity type;
Run Code Online (Sandbox Code Playgroud)

表设备类型

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=true)
private String type;

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=false)
private EquipmentModelEntity model;
Run Code Online (Sandbox Code Playgroud)

表设备模型

@DatabaseField(generatedId=true)
private UUID id;

@DatabaseField(canBeNull=false)
private String model;
Run Code Online (Sandbox Code Playgroud)

Gra*_*ray 25

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

对,这是设计的. ORMLite专门限制自动刷新子元素的次数.这样做是为了防止吞噬记忆和反对自我参照物体的巨大物体树.

引用文档foreignAutoRefresh:

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

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

引用文档maxForeignAutoRefreshLevel:

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

如果你增加maxForeignAutoRefreshLevel更多,那么它将发出额外的查询来刷新元素.

@DatabaseField(foreign=true, foreignAutoRefresh=true, canBeNull=true,
    maxForeignAutoRefreshLevel=3)
private EquipmentEntity equipment;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`maxForeignAutoRefreshLevel`的默认值具有误导性.它被设置为-1,这给出了没有max的错觉,但是默认值实际设置为`DEFAULT_MAX_FOREIGN_AUTO_REFRESH_LEVEL`,即2.这在Javadocs中有解释. (2认同)