(JCR)子冻结节点的版本

时间:2012-10-19 11:39:06

标签: jackrabbit jcr modeshape

我的问题是:你如何阅读(子)冻结节点的版本?
更多细节:
  - 让我们想象以下情况:节点A有两个子节点B和节点C.
  - 所有三个节点都是可版本化的节点(具有mixin类型)
  - 假设节点A有从1.0到1.6的7个版本:在版本1.2我们添加了节点B,在版本1.4我们添加了节点C. 我有一个例程,它打印版本1.5的节点A的“输出”

 //I already obtained the Version object version associated to node A version 1.5
 NodeIterator nodeIterator = version.getNodes(); 
 while (nodeIterator.hasNext()) { 
   Node currentNode = nodeIterator.nextNode();
   System.out.println("Node: "+currentNode.getPath());
   // I can see that some of the nodes correspond to children (versions) of 
   //node B and C ..how can I get their version? 
 }

谢谢。

1 个答案:

答案 0 :(得分:3)

父级历史记录中的每个版本都将包含一个“冻结节点”,它表示创建版本时存在的父级快照(例如,签入父节点时)。此冻结节点包含子节点,子节点是子节点的快照(如果子节点不可版本化)或“nt:versionedChild”节点(如果子节点是可版本化的)。此“nt:versionedChild”节点包含一个“jcr:childVersionHistory”REFERENCE属性,该属性指向该子项的 版本历史记录

JSR-283规范的

Section 3.13.10包含一个非常好的图表,显示了这种结构。

请注意,“nt:versionedChild”节点指向子版本历史记录中的特定版本,这意味着您必须确定哪个版本在父母签入时孩子的存在。毕竟,在这个版本化的孩子的情况下,父版和子版的历史是独立的,节点是独立检查的。 (原因可能还在于应用程序可以在单个会话中更改父节点和子节点,然后检查父节点,然后检查子节点,或检查子节点,然后检查父节点。)

执行此操作的一种方法是查看子项版本历史记录中每个版本的创建日期。这并不理想,因为它只会告诉您在创建父项时存在哪个子版本。这可能是不明确的,因为时间戳的比较取决于父项是否在版本化子项之前或之后签入。在您的应用程序中,您可能有一些约定可以帮助您解决这些歧义。

也许更好的选择是使用 版本标签 并将相同的标签应用于父版本和子版本。 (这可能在检查节点之后而不是稍后更容易。)然后,一旦您拥有父级的特定版本,获取其标签并使用它来查找子级版本中相应的子级版本历史(使用VersionHistory.getVersionByLabel(String))。