开源面向对象数据库 db4o 之旅,第 3 部分: 深入db4o
2010-04-01 00:00:00 来源:WEB开发网想必应该保存成功了吧,只是多加入了设置车牌的代码。打开 ObjectManager,如图 2 所示。很奇怪,地址保存成功了,而车牌却根本没变化。
图2. 修改地址和车牌(不成功)
查看原图(大图)
其实这也是 db4o 的有意安排。设想一个复杂对象有很多成员,并且这些成员又有自己的成员。当更新该对象,db4o 将不得不更新其所有的关联对象、关联对象的关联对象,等等。这将引起严重的性能惩罚,而且在大部分的情况下是没有必要这样的。
db4o 引入了“更新深度(update depth)”这一概念来控制被更新的对象成员树深度。默认的更新深度是 1,这就意味着只有基本类型和 String 类型的成员变量可以被更新,而修改对象成员将得不到任何反映,例如本例中修改 People 对象的 _autoInfoList 成员。
为了能更新成员对象,ob4o 提供了 cascadeOnUpdate() 方法,该方法必须在每次开启数据库之前设置清单3:
清单3. 修改地址和车牌(成功)
package com;
import bo.People;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;
public class DB4OTest{
public static void main(String[] args){
//级联设置
Db4o.configure().objectClass("bo.People")
.cascadeOnUpdate(true);
//打开数据库
ObjectContainer db = Db4o.openFile("auto.yap");
try{
ObjectSet<People> result = db.query(new Predicate<People>() {
public boolean match(People people) {
return people.getName().equals("张三");
}
});
People people = result.next();
//修改地址
people.setAddress("绵阳市xx区xxx号");
//修改车牌号
people.getAutoInfoList().get(0).setLicensePlate("川B00000");
db.set(people);
}finally{
//关闭连接
db.close();
}
}
}
- ››面向对象的JS-私有成员变量实现方式
- ››开源平台Meego和Android之间的对弈
- ››开源的Kingthy.Mail邮件组件库
- ››面向对象的JavaScript (一、对象基础,使用函数来...
- ››开源飞信Openfetion最新发布v1.8版
- ››开源重复数据删除技术纵览
- ››面向对象数据库 db4o 之旅,第 4 部分: 使用 dRS
- ››开源的 iPhone 杀手终于到来
- ››开源有优势:Android首超Windows Mobile
- ››对象存储不给高性能计算添堵
- ››面向 Java Web 应用程序的 OpenID,第 2 部分: 为...
- ››开源只不过是个幌子 揭示 Android 的真面目
更多精彩
赞助商链接