WEB开发网
开发学院软件开发Java 开源面向对象数据库 db4o 之旅,第 3 部分: 深入d... 阅读

开源面向对象数据库 db4o 之旅,第 3 部分: 深入db4o

 2010-04-01 00:00:00 来源:WEB开发网   
核心提示: 想必应该保存成功了吧,只是多加入了设置车牌的代码,开源面向对象数据库 db4o 之旅,第 3 部分: 深入db4o(3),打开 ObjectManager,如图 2 所示,例如本例中修改 People 对象的 _autoInfoList 成员,为了能更新成员对象,很奇怪,地址保存成功了

想必应该保存成功了吧,只是多加入了设置车牌的代码。打开 ObjectManager,如图 2 所示。很奇怪,地址保存成功了,而车牌却根本没变化。

图2. 修改地址和车牌(不成功)
开源面向对象数据库 db4o 之旅,第 3 部分: 深入db4o

查看原图(大图)

其实这也是 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(); 
 } 
 } 
} 

上一页  1 2 3 4 5  下一页

Tags:开源 面向 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接