【问题标题】:ORMLite not loading child foreign fieldsORMLite 不加载子外部字段
【发布时间】:2013-01-22 10:38:53
【问题描述】:

我将 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;

【问题讨论】:

    标签: android ormlite


    【解决方案1】:

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

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

    引用docs for 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;
    

    【讨论】:

    • 请注意,maxForeignAutoRefreshLevel 的默认值具有误导性。它设置为 -1,给人一种没有最大值的错觉,但默认值实际上设置为 DEFAULT_MAX_FOREIGN_AUTO_REFRESH_LEVEL,即 2。Javadocs 中对此进行了解释。
    • 好点@JasonRobinson。我已经更改了注入方式以使用默认注释值。它将在 4.49 中。
    • @Gray 您能否详细说明“如果需要,您可以随时直接在字段上调用刷新”。那怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多