【问题标题】:ORMLite LazyForeignCollection: How to query a collection only once?ORMLite LazyForeignCollection:如何只查询一次集合?
【发布时间】:2012-07-25 05:31:45
【问题描述】:

假设我有以下对象:

public class MyOwnList {

    @DatabaseField(id= true)
    protected int id;

    @ForeignCollectionField(eager = false)
    protected Collection<Item> items;
}

由于items 被标记为惰性,如果我从数据库加载列表对象,它将不会被加载。 这正是我想要的!

问题是每次我访问items时,ORMLite都会做一个sql查询来获取集合。激活ORMLite的日志后才发现...

为什么要这样做?有什么好的理由吗?

有什么方法可以延迟加载集合,但只能加载一次,而不是每次访问集合?所以介于渴望和懒惰之间?

【问题讨论】:

  • 好吧,List 这个名字只是为了举例。我只是为了避免误解而更改了它。

标签: ormlite


【解决方案1】:

问题是每次我访问项目时,ORMLite 都会进行 sql 查询来获取集合。

所以一开始我不明白这一点。您要求的是ORMLite 在第一次延迟加载后缓存项目集合。将此作为默认设置的问题是 ORMLite 不知道您的 items 集合有多大。使用惰性集合的原因之一是处理大型集合。如果 ORMLite 将所有惰性集合保存在内存中,它可能会填满内存。

我将在 TODO 列表中添加类似 lazyCached = true 的内容,它混合了懒惰和渴望。好建议。

【讨论】:

  • 在文档中它说If eager is set to true then the separate query is made immediately and the orders are stored as a list within the collection 我正在寻找第一次访问集合时延迟加载集合的组合。但是,一旦对该集合进行了 SQL 查询,请将其作为列表存储在集合中。这样,我的实体中可以有多个 LazyForeignCollections,但如果从未访问过 Collection,它们不会导致额外的 sql 查询,如 EagerForeignCollections。到目前为止,您是如何克服这样的问题的?也许有一些建议?
  • @d1rk 同样,问题是集合可能是巨大的,这可能会压倒内存。这是 hibernate 和其他 ORM 库的工作方式。你要么变得渴望,要么变得懒惰。我已将其添加到 TODO 列表中。
  • @Gray Huge upvote for this TODO - 我最初认为 Lazy 集合以这种方式工作(“lazyCached”)......部分原因是我认为 Eager 的问题更多是关于 database操作 而不是 内存消耗 (“每当您查询 A 时都会发生大量数据库操作” - ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/… )。该功能有什么进展吗?感谢 ORMLite!
  • 4.49 还没有出来,我仍然没有在更新日志中看到这个听起来很棒的功能......
  • 是的,这不会出现在 4.49 中。您可以在实现它的 github 上添加问题或(更好)拉取请求吗? github.com/j256/ormlite-core
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多