我在我的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对象,例如in example
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
方法。
谢谢!
答案 0 :(得分:4)
懒惰的集合经过了很好的测试,并且被许多其他人使用,所以尽管可能存在漏洞,但更有可能是你被懒惰的集合类欺骗了。
当从DAO检索到每个UserShow
个对象时,episodes
不会为空,而是设置为LazyForeignCollection
的实例。但是,不会进行任何其他查询,并且集合中不会包含Episode
个数据。如果您随后调用集合中的某个方法(例如userShow.getEpisodes().iterator()
),则会在此时进行单独的查询,以允许您遍历该节目的剧集。这就是懒惰集合的工作原理。
如果您仍然认为懒人收藏品不起作用,请告诉我们您如何确定节目有剧集数据。要查看在哪里进行的查询,您可以启用Android logging with ORMLite。
修改强>
事实证明@Georgy正在使用调试器来调查集合。调试器很可能调用相同的iterator()
或toArray()
方法,这些方法会导致在该时刻发出集合查询。因此,在调试器要求之前,集合中没有任何剧集。
答案 1 :(得分:1)
你的榜样应该没问题。我创建了相关的测试表并插入了2 usershows
和3 episodes
。然后,我将MySQL日志(通过使用--general-log=<log file name>
运行MySQL来设置 - 请参阅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 }
日志只显示一个选择语句:
110830 13:11:09 1 Query SELECT * FROM `usershows`
将最后一行更改为以下内容(迭代所有用户,并获取每个用户的剧集字段:
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