首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 內容倉庫規範 (JCR/JSR-170) 與主流實現產品深度解析

     編輯:Java 相關知識

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

JCR 核心模型:樹狀結構

倉庫 = 節點 + 屬性 組成的樹。節點對應目錄,屬性對應文件內容。

JCR 架構圖

節點屬性樹示例

UML 類圖

  • 節點:有唯一父節點、任意子節點、任意屬性
  • 屬性:歸屬單一節點,類型含 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.*)

關鍵接口用法

// 獲取倉庫與會話
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 統一了內容存儲訪問標準,前景光明。源碼參考:配套源碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
包功能
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訪問控制