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将存留在数据库中。
浙公网安备 33010602011771号