5

我在我的 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;
    ...
}

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

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

for (Episode e: eps) {
    e.setShow(show);
    episodeDao.create(e); 
} 

UserShow 对象有一个国外的惰性集合情节,但是当我试图获取所有 userShows 时:

shows = userShowsDao().queryForAll();

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

谢谢!

4

2 回答 2

4

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

UserShow从 DAO 中检索每个对象时,episodes不会为空,而是会使用LazyForeignCollection. 但是,不会进行其他查询,Episode并且集合中不会包含任何数据。如果您随后调用集合中的某个方法,例如userShow.getEpisodes().iterator(),则此时会进行单独的查询,以允许您遍历该节目的剧集。这就是惰性集合的工作方式。

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


编辑:

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

于 2011-08-30T13:41:02.570 回答
1

你的例子应该没​​问题。我创建了相关的测试表并插入了 2usershows和 3 episodes。然后我跟踪 MySQL 日志(通过运行 MySQL 来设置--general-log=<log file name>- 请参阅http://dev.mysql.com/doc/refman/5.5/en/query-log.html)。

完整的测试 Groovy 脚本:

import com.j256.ormlite.dao.DaoManager
import com.j256.ormlite.jdbc.JdbcConnectionSource
cs = new JdbcConnectionSource('jdbc:mysql://localhost/episode?user=root')
epDao = DaoManager.createDao(cs,Episode)
usDao = DaoManager.createDao(cs,UserShow)
usDao.queryForAll().each { println it }

日志显示只运行了一条 select 语句:

110830 13:11:09     1 Query SELECT * FROM `usershows`

将最后一行更改为以下内容(遍历所有 usershow 并获取每个 usershows 的 episodes 字段:

usDao.queryForAll().each { println it.episodes }

结果是:

110830 13:15:31     1 Query SELECT * FROM `usershows`
                    1 Query SELECT * FROM `episodes` WHERE `show_id` = 1
                    1 Query SELECT * FROM `episodes` WHERE `show_id` = 2
于 2011-08-30T12:20:19.753 回答