【问题标题】:How can I access a JCR Version of a deleted node?如何访问已删除节点的 JCR 版本?
【发布时间】:2019-09-12 10:12:12
【问题描述】:

我想访问已删除的节点的 javax.jcr.version.VersionHistory 以读取元数据和更改标签,或者可能恢复它。我怎样才能做到这一点? JCR VersionManager 提供了 getBaseVersion(java.lang.String absPath)getVersionHistory(java.lang.String absPath) 方法,当 absPath 处的节点已被删除时抛出 PathNotFoundException,尽管数据仍在 /jcr:system/jcr:versionStorage 中。

我正在使用 jackrabbit-oak 1.6.1,以防万一。非常感谢!

【问题讨论】:

    标签: java jcr jackrabbit jackrabbit-oak


    【解决方案1】:

    版本化节点删除后,修订数据还在/jcr:system/jcr:versionStorage,如果你有足够的节点信息,你可以搜索它的版本,nt:frozenNode节点-

    --jcr sql2
    SELECT * FROM [nt:frozenNode] as n WHERE ISDESCENDANTNODE ([/jcr:system/jcr:versionStorage]) and n.[jcr:title] LIKE "name%"
    

    版本节点可以转换为javax.jcr.version.Version

    Version version = (Version) frozenNode.getParent();

    并使用VersionManager.restore() 恢复 -

    VersionManager versionManager = session.getWorkspace().getVersionManager();
    versionManager.restore(path, version, true);
    

    【讨论】:

      【解决方案2】:

      AFAIU,如果版本控制节点被删除,则无法再根据原始路径访问其版本历史记录。

      这意味着您必须在删除节点之前跟踪该信息。

      【讨论】:

      • 所以我什至无法恢复它,一旦它被删除?如果可能的话,并且如果我想更改版本上的标签,我需要恢复它,更改标签,然后再次删除它? 8-}
      • 认为确实如此(有关更多信息,请参阅docs.adobe.com/content/docs/en/spec/jcr/2.0/…
      • 我认为,诀窍是在/jcr:system/jcr:versionStorage 中找到对应的nt:versionHistorynt:frozenNode 节点,从那里你应该可以恢复。在 AEM 中是可能的,它使用带有一些自定义 impl 的橡木,不能肯定地说香草长耳兔橡木。
      • 是的,你需要定位版本历史节点。一旦版本控制的节点被删除,那就很难了。如果你有,你可以检索版本信息,但是AFAIU,你不能使用restore方法,因为它需要一个版本控制的节点。
      • nt:versionHistorynt:frozenNode 可以分别转换为VersionHistory 和Version,它们实现了恢复方法,参考单元测试参考herehere
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2021-09-05
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多