所有版本信息都存储在工作区区域nt:versionHistory
下的节点上/jcr:system/jcr:versionStorage
(在存储库中的所有工作区之间共享)。该区域的结构如下所示:
+ jcr:system
+ jcr:versionStorage {jcr:primaryType = mode:versionStorage}
+ b4 {jcr:primaryType = mode:versionHistoryFolder}
+ 6d {jcr:primaryType = mode:versionHistoryFolder}
+ de {jcr:primaryType = mode:versionHistoryFolder}
+ 298905f76361779339fa3ccacc4f47664255 {jcr:primaryType = nt:versionHistory}
+ jcr:versionLabels {jcr:primaryType = nt:versionLabels}
+ jcr:rootVersion {jcr:primaryType = nt:version}
- jcr:uuid = ...
- jcr:created = ...
+ jcr:frozenNode {jcr:primaryType = nt:frozenNode}
- jcr:frozenUuid
- jcr:frozenPrimaryType
- jcr:frozenMixinTypes
该jcr:versionLabels
节点包含每个标签的属性,其中属性的名称是标签字符串,属性的值是对该标签应用的版本的 REFERENCE。
为了找到可版本化节点的标记版本,您实际上必须使用适当的类型和连接约束来查询这个“/jcr:system/jcr:versionStorage”区域的内容。
例如,要查找带有特定标签“foo”的版本,您可以执行以下操作:
SELECT versioned.* FROM [nt:frozenNode] AS versioned JOIN [nt:version] AS version ON ISCHILDNODE(versioned,version) JOIN [nt:versionLabels] AS label ON label.myLabel = version.[jcr:uuid]
这将搜索所有nt:versionLabels
节点以查找名为“myLabel”(这是您的标签的名称)的属性,然后找到该nt:version
节点指向的节点,以及nt:frozenNode
该版本的可版本控制节点的副本。
如您所见,JCR 规范规定的版本历史表示非常难以查询。
或者,您可以分两步执行此操作:
- 使用查询来查找
jcr:uuid
具有特定标签的版本
- 对于这些标识符中的每一个,找到可版本化节点的 UUID 并使用 VersionManager 查找该节点的版本历史记录并找到标记的版本。