面向 Java 开发人员的 db4o 指南: 超越简单对象
2010-04-01 00:00:00 来源:WEB开发网尽管已经对 jess 对象做了变动, ben 对象还拥有对 jess 的引用。因此内存中 jess Person 的更新会保存在数据库中。
其实不是这样。好的,我刚才是在撒谎。
测试误判
事实是,探察测试在某个地方出问题了,产生了一个误判。尽管从文档来看并不明显, ObjectContainer 保持着已激活对象的缓存,所以当清单 6 中的测试从容器中检索 Jessica 对象时,返回的是包含变动的内存对象,而不是写到磁盘上真正数据。这掩盖了一个事实,某类型的默认更新深度 是 1,意味着只有原语值(包括 String)才会在调用 set() 时被存储。为了使该行为生效,我必须稍微修改一下测试,如清单 7 所示:
清单 7. 测试误判
@Test(expected=AssertionError.class)
public void testDependentUpdate()
{
List<Person> maleGalbraiths =
db.query(new Predicate<Person>() {
public boolean match(Person candidate) {
return candidate.getLastName().equals("Galbraith") &&
candidate.getGender().equals(Gender.MALE);
}
});
Person ben = maleGalbraiths.get(0);
assertTrue(ben.getSpouse().getAge() == 29);
// Happy Birthday, Jessica!
ben.getSpouse().setAge(ben.getSpouse().getAge() + 1);
// We only have a reference to Ben, so store that and commit
db.set(ben);
db.commit();
// Close the ObjectContainer, then re-open it
db.close();
db = Db4o.openFile("persons.data");
// Find Jess, make sure she's 30
Person jess = (Person)db.get(
new Person("Jessica", "Galbraith", null, 0, null)).next();
assertTrue(jess.getAge() == 30);
}
更多精彩
赞助商链接