ORMLite和惰性集合的问题

Geo*_*zov 5 collections android ormlite foreign-collection

我在我的android项目中使用ormlite.我有两节课

@DatabaseTable(tableName = "usershows")
public class UserShow {
    @DatabaseField(id = true)
    private Integer showId;

    @ForeignCollectionField(eager = false)
    private ForeignCollection<Episode> episodes;
    ...
}

@DatabaseTable(tableName = "episodes")
public class Episode {
    @DatabaseField(id = true)
    private Integer episodeId;

    @DatabaseField(foreign = true)
    private UserShow show;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在保存我的UserShows对象,如示例中所示

UserShow show = new UserShow();
userShowDao.create(show);

for (Episode e: eps) {
    e.setShow(show);
    episodeDao.create(e); 
} 
Run Code Online (Sandbox Code Playgroud)

UserShow对象有一个外来的懒惰集合剧集,但是当我试图获取所有userShows时:

shows = userShowsDao().queryForAll();
Run Code Online (Sandbox Code Playgroud)

我正在使用剧集集合获取所有节目对象.为什么会这样?集合是懒惰的,我必须得到null或其他东西,但没有Episode对象的集合.如何让这个系列真的很懒?如果ORMLite能够在没有延迟集合的情况下获取对象并在真正需要时进行初始化,那么它可能会很酷.例如作为Hibernate.initialize方法.

谢谢!

Gra*_*ray 4

惰性集合已经过良好的测试,并且被许多其他人使用,因此尽管它可能存在错误,但您更有可能被惰性集合类欺骗。

UserShow当从 DAO 检索每个对象时,episodes不会为 null,而是会设置为 的实例LazyForeignCollectionEpisode但是,不会进行其他查询,并且集合中不会包含任何数据。如果您随后调用集合上的方法之一(例如 )userShow.getEpisodes().iterator(),则此时会进行单独的查询,以允许您迭代该节目的剧集。这就是惰性集合的工作原理。

如果您仍然认为惰性集合不起作用,请向我们展示您如何确定节目具有剧集数据。要查看在何处执行哪些查询,您可以使用 ORMLite 启用 Android 日志记录


编辑:

事实证明,@Georgy 正在使用调试器来调查该集合。调试器很可能调用相同的iterator()toArray()方法,导致在该时刻发出集合查询。因此,在调试器请求之前,集合中没有任何剧集。