WEB开发网
开发学院软件开发Java 面向 Java 开发人员的 db4o 指南: db4o 中的数据库... 阅读

面向 Java 开发人员的 db4o 指南: db4o 中的数据库重构

 2010-04-01 00:00:00 来源:WEB开发网   
核心提示: 结果有些令人吃惊,如清单 6 所示:清单 6. db4o 应付自如[Person:firstName=BrianlastName=Slettenage=38mood=null][Person:firstName=BrianlastName=Goetzage=39mood=null]在 Perso

结果有些令人吃惊,如清单 6 所示:

清单 6. db4o 应付自如

[Person: firstName = Brian lastName = Sletten age = 38 mood = null] 
[Person: firstName = Brian lastName = Goetz age = 39 mood = null] 

在 Person 的两个定义(一个在磁盘上,另一个在代码中)并不一致的事实面前,db4o 不但没有 卡壳,而且更进了一步:它查看磁盘上的数据,确定那里的 Person 实例没有 mood 字段,并静默地用默认值 null 替代。(顺便说一句,在这种情况下,Java Object Serialization API 也是这样做的。)

这里最重要的一点是,db4o 静默地处理它看到的磁盘上的数据与类型定义之间的不匹配。这成为贯穿 db4o 重构行为的永恒主题:db4o 尽可能静默地处理版本失配。它或者扩展磁盘上的元素以包括添加的字段,或者,如果给定 JVM 中使用的类定义中不存在这些字段,则忽略它们。

代码到磁盘兼容性

db4o 对磁盘上缺失的或不必要的字段进行某种调整,这一思想需要解释一下,所以让我们看看当更新磁盘上的数据以包括情绪时会出现什么情况,如清单 7 所示:

清单 7. 我们很好

        import com.db4o.*; 
import com.tedneward.model.*; 
 
// Version 2 
public class BuildV2 
{ 
  public static void main(String[] args) 
    throws Exception 
  { 
    ObjectContainer db = null; 
    try 
    { 
      db = Db4o.openFile("persons.data"); 
 
      // Find all the Persons, and give them moods 
      ObjectSet people = db.get(Person.class); 
      while (people.hasNext()) 
      { 
        Person person = (Person)people.next(); 
         
        System.out.print("Setting " + person.getFirstName() + "'s mood "); 
        int moodVal = (int)(Math.random() * Mood.values().length); 
        person.setMood(Mood.values()[moodVal]); 
        System.out.println("to " + person.getMood()); 
        db.set(person); 
      } 
       
      db.commit();       
    } 
    finally 
    { 
      if (db != null) 
        db.close(); 
    } 
  } 
} 

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:面向 Java 开发

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