在本系列文章中,我使用 Person 類型來演示 db4o 的所有基本原理。您已經學會了如何創建完整的 Person 對象圖,以細粒度方式(使用 db4o 本身的查詢功能來限制返回的實際對象圖)對其進行檢索,以及更新和刪除全部的對象圖(設定一些限制條件)等等。實際上,在面向對象的所有特性中,我們只漏掉了其中一個,那就是繼承。
關于本系列
信息存儲和檢索作為同義語伴隨 RDBMS 已經有 10 余年了,但現在情況有所改變。Java 開發人員為所謂的對象關系型阻抗失配而沮喪,也不再有耐心去嘗試解決這個問題。加上可行替代方案的出現,就導致了人們對對象持久性和檢索的興趣的復蘇。 面向 Java 開發人員的 db4o 指南 對開放源碼數據庫 db4o 進行了介紹,db4o 可以充分利用當前的面向對象的語言、系統和理念。請訪問 db4o 主頁 并下載 db4o;您需要用它來完成本文中的例子。
我將演示的這個例子的最終目標是一個用于存儲雇員數據的數據管理系統,我一直致力于開發我的 Person 類型。我需要這樣一個系統:存儲某個公司的員工及其配偶和子女的信息,但是此時他們僅僅是該系統的 Person(或者,可以說 Employees 是一個 Person,但是 Persons 不是一個 Employee)。而且,我不希望 Employee 的行為屬于 Person API 的一部分。從對象建模程序的角度公平地講,按照 is-a 模擬類型的能力就是面向對象的本質。
我會用 Person 類型中的一個字段來模擬雇傭 的概念。這是一種關系方法,而且不太適合用于對象設計。幸運的是,與大多數 OODBMS 系統一樣,db4o 系統對繼承有一個完整的理解。在存儲系統的核心使用繼承可以輕松地 “重構” 現有系統,可以在設計系統時更多地使用繼承,而不會使查詢工具變得復雜。您將會看到,這也使查詢特定類型的對象變得更加容易。
高度改進的 Person
清單 1 回顧了 Person 類型,該類型在本系列文章中一直作為示例使用:
清單 1. 改進之前的示例……
package com.tedneward.model;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class Person
{
public Person()
{ }
public Person(String firstName, String lastName, Gender gender, int age, Mood mood)
{
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
this.mood = mood;
}
public String getFirstName() { return firstName; }
public void setFirstName(String value) { firstName = value; }
public String getLastName() { return lastName; }
public void setLastName(String value) { lastName = value; }
public Gender getGender() { return gender; }
public int getAge() { return age; }
public void setAge(int value) { age = value; }
public Mood getMood() { return mood; }
public void setMood(Mood value) { mood = value; }
public Person getSpouse() { return spouse; }
public void setSpouse(Person value) {