WEB开发网
开发学院软件开发Java 面向 Java 开发人员的 db4o 指南: 超越简单对象 阅读

面向 Java 开发人员的 db4o 指南: 超越简单对象

 2010-04-01 00:00:00 来源:WEB开发网   
核心提示: 尽管已经对 jess 对象做了变动, ben 对象还拥有对 jess 的引用,面向 Java 开发人员的 db4o 指南: 超越简单对象(8),因此内存中 jess Person 的更新会保存在数据库中,其实不是这样,意味着只有原语值(包括 String)才会在调用 set() 时被存储,为了使

尽管已经对 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); 
} 

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

Tags:面向 Java 开发

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