go4it

just do it

DB4O学习(七)--继承关联

1.继承保存

// C# & JAVA
Employee e1 = new Employee("Michael", "1234", "michael", 101, "10/5/1975");
Manager m1 = new Manager("Sue", "9876", "sue", 102, "3/8/1982");
CasualEmployee c1 = new CasualEmployee("Tim", "5544", "tim", 103, "7/6/1986");
Customer cu1 = new Customer("Gary", "408 123 4567", "gary@example.net", new
    Address("1 First Street", "San Jose", "USA"));
// JAVA
db.set(e1);
db.set(m1);
db.set(c1);
db.set(cu1);

分开保存。

 

2.查询manager

// JAVA
Manager managerExample = new Manager(null, null, null, 0, null);
ObjectSet results = db.get(managerExample);

 

查询父类employee:

// JAVA
Employee employeeExample = new Employee(null, null, null, 0, null);
ObjectSet results = db.get(employeeExample);

则输出自己及继承的类:

Tim (CasualEmployee)
Sue (Manager)
Michael (Employee)

 

查询抽象类或接口来获取全部的对象:

// JAVA
ObjectSet results = db.get(AbstractPerson.class);
// JAVA
ObjectSet results = db.get(Person.class);

 

输出:

Gary (Customer)
Tim (CasualEmployee)
Sue (Manager)
Michael (Employee)

 

3.数组属性

public class CasualEmployee extends Employee {
    
    double[] _timeRecord;
        final int MAXTIMERECORDS = 10;
        int numberOfTimeRecords;

        public CasualEmployee(String name, String phoneNumber, String email, int employeeNumber, String dob) 
        {
             super(name, phoneNumber, email, employeeNumber, dob);
            _timeRecord = new double[MAXTIMERECORDS];
            numberOfTimeRecords = 0;

        }

        public double[] getTimeRecord()
        {
                return _timeRecord;
        }
        
        public void setTimeRecord(double[] timeRecord)
        {
                _timeRecord = timeRecord;
        }

        public void addTimeRecord(double newRecord)
        {
            if (numberOfTimeRecords < MAXTIMERECORDS)
            {
                _timeRecord[numberOfTimeRecords] = newRecord;
                numberOfTimeRecords++;
            }
        }

        public String toString()
        {
            return super.getName() + " (CasualEmployee)";
        }
    
}

 

保存:

// C# & JAVA
CasualEmployee c1 = new CasualEmployee("Tim", "5544", "tim", 101, "7/6/1986");
CasualEmployee c2 = new CasualEmployee("Eva", "4433", "eva", 102, "11/3/1984");
c1.addTimeRecord(2.5);
c1.addTimeRecord(4.0);
c1.addTimeRecord(1.5);
c1.addTimeRecord(2.0);
c2.addTimeRecord(3.5);
c2.addTimeRecord(4.0);
c2.addTimeRecord(5.0);
// JAVA
db.set(c1);
db.set(c2);
 

查询:

CasualEmployee casEmpExample = new CasualEmployee(null, null, null, 0, null);
casEmpExample.setTimeRecord(new double[]{4.0});
ObjectSet results = db.get(casEmpExample);

或者进一步:

// JAVA
CasualEmployee casEmpExample = new CasualEmployee(null, null, null, 0, null);
casEmpExample.setTimeRecord(new double[]{2.5, 4.0});
ObjectSet results = db.get(casEmpExample);

 

NQ查询:

List<CasualEmployee> casEmps = db.query(new Predicate<CasualEmployee>() {
    public boolean match(CasualEmployee casEmp)
    {
        return Arrays.binarySearch(casEmp.getTimeRecord(),2.5) >= 0 &&
            Arrays.binarySearch(casEmp.getTimeRecord(),4.0) >= 0;
    }

 

SODA查询:

// JAVA
Query query = db.query();
query.constrain(CasualEmployee.class);
Query valuequery = query.descend("_timeRecord");
valuequery.constrain(2.5);
valuequery.constrain(4.0);
ObjectSet results = query.execute();

 

4.数组属性的更新删除

  更新:

// JAVA
CasualEmployee casEmpExample = new CasualEmployee("Tim", null, null, 0, null);
ObjectSet results = db.get(casEmpExample);
CasualEmployee ce = (CasualEmployee)results.next();
ce.addTimeRecord(6.0);
ce.getTimeRecord()[0] = 7.0;
db.set(ce);
 

For a numeric array, it is not necessary to set CascadeOnUpdate for this to work.

 

5.集合操作:

public class Project {
    
    String _name;
    String _costCode;
    List<Employee> _employees;
    
    public Project(String name, String costCode) {
        _name = name;
        _costCode = costCode;
        _employees = new ArrayList<Employee>();
    }
    
    public Project(String name, String costCode, List<Employee> employees) {
        _name = name;
        _costCode = costCode;
        _employees = employees;
    }
    
    public void assignEmployee(Employee newEmployee) {
        _employees.add(newEmployee);
        if(!newEmployee.projects().contains(this))
            newEmployee.assignToProject(this);
    }
    
   
    public List<Employee> employees() {
        return _employees;
    }
    
    public String toString() {
        return _name + " (Project)";
    }
    
}

 

存储:

// C# & JAVA
Employee e1 = new Employee("Michael", "1234", "michael", 101, "10/5/1975");
Employee e2 = new Employee("Anne", "5432", "anne", 102, "8/5/1980");
CasualEmployee c1 = new CasualEmployee("Tim", "5544", "tim", 103, "7/6/1986");
CasualEmployee c2 = new CasualEmployee("Eva", "4433", "eva", 104, "11/3/1984");
Project p1 = new Project("Finance System", "P01");
Project p2 = new Project("Web Site", "PO2");
// JAVA
p1.assignEmployee(e1);
p1.assignEmployee(c1);
p2.assignEmployee(c2);
db.set(p1);
db.set(p2);

通过存储project则自动存储employee。

 

查询:

When you retrieve a structured object, then by default you also get associated objects. This
includes objects that are contained in a collection, so when you retrieve a Project, you should
also retrieve the Employees, if the activation depth allows it.

如果激活深度允许,则可以同时查询employee。

 

Project projectExample = new Project(null, "P01");
ObjectsSet results = db.get(projectExample);
while (results.hasNext())
{
    Project proj = (Project)results.next();
    System.out.println(proj);
    for(Employee empl : proj.Employees)
    {
        System.out.println (empl);
    }
}
 
通过集合查询:
// JAVA
Employee emp = new Employee("Anne", null, null, 0, null);
List<Employee> empList = new ArrayList<Employee>();
empList.add(emp);
Project projectExample = new Project(null,null,empList);
ObjectSet results = db.get(projectExample);
 

如果只需访问同一个项目里的employee而无需project其他属性,可以如下:

Employee emp = new Employee("Anne", null, null, 0, null);
List<Employee> empList = new ArrayList<Employee>();
empList.add(emp);
ObjectSet results = db.get(empList);
 
NQ版本:
List<Project> projects = db.query(new Predicate<Project>()
{
    public boolean match(Project proj)
    {
        for(Employee empl : proj.employees())
        {
            if (empl.getName().equals("Michael"))
            {
                return true;
            }
        }
        return false;
    }
});

 

SODA版本:

// JAVA
Query query = db.query();
query.constrain(Project.class);
Query empQuery = query.descend("_employees");
empQuery.constrain(Employee.class);
Query nameQuery = empQuery.descend("_name");
nameQuery.constrain("Michael");
ObjectSet results = query.execute();
 

6.集合更新和删除

// JAVA
Project projectExample = new Project(null, "P02");
ObjectSet results = db.get(projectExample);
while (results.hasNext())
{
    Project proj = (Project)results.next();
    for(Employee empl : proj.employees())
    {
        empl.setEmail(empl.getEmail() + ".web");
    }
    db.set(proj);
}
// JAVA
db.delete(proj.employees());
db.delete(proj);
如果只删除project而没有设置级联删除的话,employee将存留在数据库中。
 

posted on 2009-02-20 09:41  cxccbv  阅读(423)  评论(0)    收藏  举报

导航