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

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

 2010-04-01 00:00:00 来源:WEB开发网   
核心提示: 测试时,得到 AssertionFailure,面向 Java 开发人员的 db4o 指南: 超越简单对象(9),说明此前有关对象图中层叠展开的对象更新的论断是错误的,(通过将您希望抛出异常的类类型的 @Test 注释的值设置为 expected,在打开 ObjectContainer 之前,必

测试时,得到 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); 
} 

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

Tags:面向 Java 开发

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