【问题标题】:JCR -ModeShape : Create unique node namesJCR -ModeShape:创建唯一的节点名称
【发布时间】:2013-09-30 11:27:58
【问题描述】:

我需要将一些节点 [文件] 添加到节点 [文件夹]。但也许其中一些具有相同的名称。 像这样:

附加\文件名1
附加\文件名2
附加\文件名1

我想要一个唯一的 ID(主键)而不是文件名,因为我在另一个节点中使用了这个路径。有没有办法在 JCR 中创建类似于自动生成的 ID 的东西?还是我必须务实地管理它?

提前致谢

【问题讨论】:

    标签: nodes jcr modeshape


    【解决方案1】:

    JCR 对具有相同名称的子节点的标准方法是使用同名兄弟或 SNS(请参阅 herehere)。但是,通常不鼓励使用它们,因为随着节点的子节点被移动、重命名、插入和删除,给定子节点的同名兄弟索引(以及路径)可能会发生变化。

    JCR 2.0 API 也没有定义自动生成唯一子节点名称的方法。 (JSR-333 或“JCR 2.1”即​​将最终采用,并将添加一种以自动方式添加具有唯一名称的子节点的方法。ModeShape 计划在 4.0 中支持 JSR-333;请查看我们的roadmap 了解时间表.)

    因此,鉴于此,有两种方法可以完成您的要求,并且这两种技术在 ModeShape 集群中都能很好地工作。

    生成您自己的唯一名称

    标准的nt:folder 节点类型确实不允许允许具有同名兄弟姐妹的子节点。毕竟,nt:foldernt:file 的设计行为类似于大多数文件系统,其中大多数不允许具有相同名称的文件/文件夹。因此,当您创建一个主要类型为 nt:folder 的节点时,每个子节点都必须有一个唯一的名称。

    为孩子创建唯一名称的一种非常简单的方法是使用标准的java.util.UUID 类。只需生成一个唯一的 ID,并在新孩子的名字中使用字符串形式。

    使用同名兄弟姐妹 (SNS)

    或者,如果您希望存储库通过 SNS 索引管理子节点名称的唯一性,并且可以忍受 SNS 节点的缺点,那么只需定义一个 custom node type 即可实现这一点。例如,这是一个节点类型定义,它包含子类型 nt:hierarchyNode(它是 nt:foldernt:file 的超类型),因此 相似 但与 nt:folder 无关:

    [acme:folder] > nt:hierarchyNode 
    + * (nt:hierarchyNode) version sns
    

    (您的自定义节点类型不需要扩展nt:hierarchyNode,但这样做可以使nt:folder 包含nt:filent:folder类型的节点@987654339 @.)

    注册此节点类型定义后,只需使用该自定义类型作为主要类型创建您的文件夹节点(或稍后更改主要类型,ModeShape 确实支持)。

    【讨论】:

    • 我知道 SNS 会为一个节点获取子节点的同名,但正如我所说的,因为我想在另一个地方使用节点路径 [attach\fileName1] 它不应该重复。因此我使用第一种建议的方式:使用 java.util.UUID 生成唯一名称。谢谢
    • 对不起!我有另一个问题?是否可以在 JCR 新版本中添加一种方法来获取最后添加的节点到存储库?像这样: getLastAddedNode() 它有助于生成一个 ID。再次感谢您。
    • 不,这种方法在 JCR 的有状态会话的上下文中没有意义。您可以只获取最后一个子节点,因为默认情况下子节点是有序的。但是,这两种方法在并发负载下都很难使用:最后添加的节点名称只有在另一个会话添加子节点之前才是正确的。 ModeShape 将改为添加对新 JSR-333 方法的支持,这些方法添加具有自动生成名称的子节点,这些名称使用用户提供的可选提示。
    • 谢谢,如何获取节点的最后一个子节点?我找不到任何方法!
    • 你必须迭代。您可以在匹配特定模式的节点或所有节点上获取迭代器。
    【解决方案2】:

    您可以通过使用JcrUtils 来执行此操作,您可以为节点指定名称提示,即您的“fileName”和 JcrUtil 将在其前面附加一个数字,从而产生类似于“fileName0”的内容,下面将完全正确你要的是什么:

    JcrUtils.getOrCreateUniqueByPath(attach, "fileName", "type goes here");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多