在JDO問世前,Java持久化面臨三大困境:序列化缺乏交易/查詢/共享機制;JDBC迫使開發者在物件模型與關聯資料模型間手動映射,喪失OO優勢;EJB CMP則過於笨重,需應用伺服器環境。JDO提供單一物件模型、透明持久化、支援多種資料源(關聯式/物件/檔案)的輕量級方案,甚至可作為EJB底層持久化引擎。
JDO要求持久化類別:
java.util.Collection介面表達定義三個持久化類別:
// Movie.java
public class Movie {
private String title;
private Date releaseDate;
private int runningTime;
private String rating;
private Set<Role> cast = new HashSet<>(); // 關聯角色集合
private Movie() {} // JDO要求的無參建構子
public Movie(String title, Date release, int duration, String rating, String genres) { ... }
public void addRole(Role role) { cast.add(role); }
public Set<Role> getCast() { return Collections.unmodifiableSet(cast); }
// 日期格式化輔助方法...
}
Actor與Role同理,Role作為關聯實體持有Movie與Actor參考及角色名稱。此設計展現JDO如何以純Java物件圖表達複雜領域關係,完全脫離SQL。
JDO規範定義PersistenceManager、Query、Transaction等核心介面,實作廠商負責映射至底層資料庫。開發者專注於物件模型設計與業務邏輯,持久化操作簡化為:
PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); tx.begin(); pm.makePersistent(movie); // 透明儲存整個物件圖 tx.commit();
這正是「一次建模,多重部署」的威力所在。