對于這個問題已經有一些解決方案,例如Hibernate和Java Data Objects,他們為開發者提供了透明的持久性——應用程序只需使用面向對象的API處理持久性的對象,而不需要在Java代碼中嵌入SQL語句。對于EJB的容器來說,容器治理的持久性(CMP)做了類似的工作,但是對Java平臺來說這不是一個一般的持久性工具。在任何這些解決方案中,對象通過底層框架被映射關系數據庫中的表,這些底層的框架生成SQL所需要存取的對象的屬性。也就是說,對象模型越復雜,這種映射就越困難。我們所用的描述符,通常使用xml文件,來定義這種映射關系。繼續和多對多的關系,尤其是一些關系模型無法直接表示的關系增加了映射復雜度。繼續的結構可以有不同的方式被映射到一組表中,選擇何種方式就需要在儲存的效率和查詢的復雜度上權衡,就如一個單獨的表要實現一個多對多的關系一樣。
Db4o已經被一些嵌入式系統的應用程序所選用,這些程序特點都是要求零治理、高可靠性和低功耗的。例如,在德國,BMW Car IT在汽車嵌入式系統電子原型中使用了它。同樣是德國的Die Mobilanten,他們在中型公共事業的PDA解決方案中使用了db4o。在美國,Massie Systems為嬰兒眼睛診斷的視網膜圖像處理系統依靠db4o加強其客戶交流圖像數據庫。
Player class public class Player { protected String name; protected int squadNumber; protected float battingAverage; protected Team team; public Player(String name, int squadNumber, float battingAverage){ this.name = name; this.squadNumber = squadNumber;
this.battingAverage = battingAverage; } public void setName(String n){this.name = n;} public String getName(){return this.name;} public void setSquadNumber(int s){this.squadNumber = s;} public int getSquadNumber(){return this.squadNumber;} public void setBattingAverage(final float b) { this.battingAverage = b; } public float getBattingAverage(){ return this.battingAverage;} public void setTeam(Team t) {this.team = t;} public Team getTeam() {return this.team;} public String toString() { return name + ":" + battingAverage; } }
Pitcher class public class Pitcher extends Player{
private int wins;
public Pitcher(String name, int squadNumber, float battingAverage, int wins) { super(name,squadNumber,battingAverage); this.wins = wins; } public void setWins(final int w){this.wins = w;} public int getWins() {return this.wins;} public String toString() { return name + ":" + battingAverage + ", " + wins; } }
Team class import java.util.List; import java.util.ArrayList; public class Team { private String name; private String city;
private int won;
private int lost; private List players; public Team(String name, String city, int won, int lost){ this.name = name; this.city = city; this.won = won; this.lost = lost; this.players = new ArrayList(); } public void addPlayer(Player p) { players.add(p); } public void setName(String n){this.name = n;} public String getName(){return this.name;}
public void setStadium(String c){this.city = c;} public String getCity(){return this.city;} public void setPlayers(List p){players = p;} public List getPlayers(){return players;} public void setWon(int w) {this.won = w;} public int getWon(){return this.won;} public void setLost(int l) {this.lost = l;} public int getLost() {return this.lost;} public String toString() { return name; } }
首先,我們來建立一些測試數據。
// Create Players Player p1 = new Player("Barry Bonds", 25, 0.362f); Player p2 = new Player("Marquis Grissom", 9, 0.279f); Player p3 = new Player("Ray Durham", 5, 0.282f); Player p4 = new Player("Adrian Beltre", 29, 0.334f); Player p5 = new Player("Cesar Izturis", 3, 0.288f); Player p6 = new Player("Shawn Green", 15, 0.266f); // Create Pitchers Player p7 = new Pitcher("Kirk Rueter",46, 0.131f, 9); Player p8 = new Pitcher("Kazuhisa Ishii",17, 0.127f, 13); // Create Teams Team t1 = new Team("Giants", "San Francisco", 91, 71); Team t2 = new Team("Dodgers", "Los Angeles", 93, 69); // Add Players to Teams t1.addPlayer(p1); p1.setTeam(t1); t1.addPlayer(p2); p2.setTeam(t1); t1.addPlayer(p3); p3.setTeam(t1); t2.addPlayer(p4); p4.setTeam(t2); t2.addPlayer(p5); p5.setTeam(t2); t2.addPlayer(p6); p6.setTeam(t2); // Add Pitchers to Teams t1.addPlayer(p7); p7.setTeam(t1); t2.addPlayer(p8); p8.setTeam(t2);
Player examplePlayer = new Player(null,0,0f); ObjectSet result=db.get(examplePlayer); System.out.println(result.size()); while(result.hasNext()) { System.out.println(result.next()); }
結果如下:
8 Kazuhisa Ishii:0.127, 13 Shawn Green:0.266 Cesar Izturis:0.288 Adrian Beltre:0.334 Kirk Rueter:0.131, 9 Ray Durham:0.282 Marquis Grissom:0.279 Barry Bonds:0.362
Player examplePlayer = new Player("Shawn Green",0,0f); ObjectSet result = db.get(examplePlayer); Player p = (Player) result.next(); p.setBattingAverage(0.299f); db.set(p);
數據庫的對象也可以以同樣的方式被刪除。
Player examplePlayer = new Player("Ray Durham",0,0f); ObjectSet result = db.get(examplePlayer); Player p = (Player) result.next(); db.delete(p);
System.out.println(result.size()); while(result.hasNext()) { // Print Player Player p = (Player) result.next(); System.out.println(p); // Getting Player also gets Team - print Team Team t = p.getTeam(); System.out.println(t); }
輸出:
2 Adrian Beltre:0.334 Dodgers Barry Bonds:0.362 Giants
現在的查詢十分類似SQL語言查詢,如下:
SELECT teams.name, players.name, players.battingAverage FROM teams, players WHERE teams.teamID = players.playerID AND battingAverage > 0.3