面向 Java 开发人员的 db4o 指南: 超越简单对象
2010-04-01 00:00:00 来源:WEB开发网测试时,得到 AssertionFailure,说明此前有关对象图中层叠展开的对象更新的论断是错误的。(通过将您希望抛出异常的类类型的 @Test 注释的值设置为 expected,可以使 JUit 提前预测到这种错误。)
设置层叠行为
Db4o 仅仅返回缓存对象,而不对其更多地进行隐式处理,这是一个有争议的话题。很多编程人员认为要么这种行为是有害的并且违反直觉,要么这种行为正是 OODBMS 应该做的。不要去管这两种观点优劣如何,重要的是理解数据库的默认行为并且知道如何修正。在清单 8 中,使用 ObjectClass.setCascadeOnUpdate() 方法为一特定类型改变 db4o 的默认更新动作。不过要注意,在打开 ObjectContainer 之前,必须设定该方法为 true。清单 8 展示了修改后的正确的层叠测试。
清单 8. 设置层叠行为为 true
@Test
public void testWorkingDependentUpdate()
{
// the cascadeOnUpdate() call must be done while the ObjectContainer
// isn't open, so close() it, setCascadeOnUpdate, then open() it again
db.close();
Db4o.configure().objectClass(Person.class).cascadeOnUpdate(true);
db = Db4o.openFile("persons.data");
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);
}
更多精彩
赞助商链接