關係數據庫處理二進制內容(圖像、文檔)乏力,文件系統又缺乏查詢、事務、版本控制。JSR-170 (JCR) 定義統一 API 訪問內容倉庫,解決廠商鎖定與異構整合難題。本文系統講解 JCR 模型、API、實現級別與三大產品:Jackrabbit、eXo JCR、Jeceira。
JCR 核心模型:樹狀結構
倉庫 = 節點 + 屬性 組成的樹。節點對應目錄,屬性對應文件內容。



- 節點:有唯一父節點、任意子節點、任意屬性
- 屬性:歸屬單一節點,類型含 String、Binary、Date、Long、Double、Boolean、Stream
- 路徑定位:絕對路徑 `/a/d/i`、相對路徑 `d/i`(相對 `/a`)
節點類型系統
- 主節點類型:強制,定義節點名、允許的子節點/屬性結構。記錄於 `jcr:primaryType`
- 混合類型:可選,擴展額外特性(如 `mix:versionable`、`mix:lockable`)。記錄於 `jcr:mixinTypes`
- 規范預定義基礎類型,Level 2 才允許自定義類型
進階特性
同名兄弟節點 (SNS)
父節點類型決定是否允許。路徑定位用數組語法:`/a/b[2]/c[3]` 表示第 2 個 b 下第 3 個 c。索引從 1 起。
子節點排序
可選特性。`Node.orderBefore()` 調整順序,影響 `getNodes()` 迭代器返回序列。SNS 也可排序。
屬性類型與多值
支持 `STRING`、`BINARY`、`DATE`、`LONG`、`DOUBLE`、`BOOLEAN`、`NAME`、`PATH`、`REFERENCE`。多值屬性值有序、同類型,`getValues()` 返回數組。
三大實現級別

| 級別 | 能力 | 強制性 |
| Level 1 (只讀) | 節點/屬性讀取、屬性值讀取、XML/SAX 導出、XPath 查詢、節點類型訪問、權限讀取 | 所有實現必須支持 |
| Level 2 (讀寫) | 增刪節點/屬性、屬性值寫入、命名空間持久化、XML/SAX 導入、指派節點類型 | 可選 |
| 可選特性 | 事務 (JTA/JDBC)、版本控制、事件監聽、鎖定、SQL 查詢 | 可選 |
核心 API (javax.jcr.*)
| 包 | 功能 |
| javax.jcr | 核心接口:Repository、Session、Node、Property、Item、Value、Workspace |
| javax.jcr.lock | 鎖管理 |
| javax.jcr.nodetype | 節點類型操作 |
| javax.jcr.observation | 事件訂閱 |
| javax.jcr.query | 查詢 (XPath/SQL) |
| javax.jcr.version | 版本控制 |
| javax.jcr.security | 訪問控制 |
關鍵接口用法
// 獲取倉庫與會話
InitialContext ctx = ...;
Repository repository = (Repository) ctx.lookup("myrepo");
Credentials cred = new SimpleCredentials("user", "pass".toCharArray());
Session session = repository.login(cred, "workspace");
// 基本操作
Node root = session.getRootNode();
Node node = root.getNode("a/e");
Property prop = node.getProperty("k");
Value val = prop.getValue();
double d = val.getDouble();
// 直接按路徑/UUID 定位
Property p = (Property) session.getItem("/a/e/k");
Node n = session.getNodeByUUID("1111 2222 3333 4444");
// 寫操作需 session.save() 持久化
node.setProperty("name", "value");
session.save();
事務與隔離
- 無事務:`save()` 後立即對其他 Session 可見
- 有事務:提交前對其他 Session 不可見,未 `save()` 的變更不參與提交
Spring JCR 模塊
簡化 JCR 開發,類似 Spring ORM:
- JcrTemplate:封裝 Session 生命周期、事務回滾、異常處理,實現 Callback 模式
- RepositoryFactoryBean:配置/啟動/停止倉庫,預置 Jackrabbit、Jeceira 實現
- SessionFactory:統一 Repository/Credentials/Workspace,自動註冊監聽器/命名空間
- OpenSessionInView:攔截器/過濾器,線程級 Session 共享
三大主流實現產品
Apache Jackrabbit (參考實現)
- 支持 Level 1/2 + 所有可選特性
- 1.6.2 穩定可用於生產
- 額外功能:SessionListeners、CustomNode 註冊、JCA 連接器、WebDAV、虛擬文件系統、JDBC 後端
- Apache 2.0 許可,Day Software 商業產品基礎
eXo JCR / ECM
- eXo Platform 組件,支持強制特性 + 多項可選特性
- 後端:MySQL、DB2、HSQL (默認)
- 雙許可:GPL / 商業
- ECM 產品提供 Portlet、工作流、文檔/記錄管理、Web 內容管理
- 高度可定制,模擬文件瀏覽器體驗
Jeceira
- 較新項目,Level 1/2 部分實現,寫操作支持觀察事件
- Magnolia CMS 采用
- Apache 2.0 許可,HSQLDB 存儲
- 計劃最終覆蓋所有級別,發布時間未定
未來演進:JSR-283 (JCR 2.0)
- Remoting / 客戶端-服務器協議
- 標準節點類型增強:元數據、國際化
- 擴展內容模型能力
- 綁定/映射框架:Java Bean ⇄ JCR 樹雙向映射
- 基於 JCR 的 WebDAV 服務器
- 連接器生態:Alfresco、BEA Portal、IBM Domino 已提供 JSR-170 連接器
Spring JCR 路線圖
- Acegi 安全集成
- Spring 2.0 命名空間支持(減少 XML 配置)
- 更多 JCR 實現整合
JCR 統一了內容存儲訪問標準,前景光明。源碼參考:配套源碼
- 上一篇文章: JavaEye 3.0 開發手記之一:Windows 下 Ruby on Rails 高效開發環境構建
- 下一篇文章: iBATIS 3 新特性深度解析:註解映射、XML 配置與遷移指南
Copyright ©
程式碼之家 All Rights Reserved