【发布时间】:2013-09-30 11:27:58
【问题描述】:
我需要将一些节点 [文件] 添加到节点 [文件夹]。但也许其中一些具有相同的名称。 像这样:
附加\文件名1
附加\文件名2
附加\文件名1
我想要一个唯一的 ID(主键)而不是文件名,因为我在另一个节点中使用了这个路径。有没有办法在 JCR 中创建类似于自动生成的 ID 的东西?还是我必须务实地管理它?
提前致谢
【问题讨论】:
我需要将一些节点 [文件] 添加到节点 [文件夹]。但也许其中一些具有相同的名称。 像这样:
附加\文件名1
附加\文件名2
附加\文件名1
我想要一个唯一的 ID(主键)而不是文件名,因为我在另一个节点中使用了这个路径。有没有办法在 JCR 中创建类似于自动生成的 ID 的东西?还是我必须务实地管理它?
提前致谢
【问题讨论】:
JCR 对具有相同名称的子节点的标准方法是使用同名兄弟或 SNS(请参阅 here 和 here)。但是,通常不鼓励使用它们,因为随着节点的子节点被移动、重命名、插入和删除,给定子节点的同名兄弟索引(以及路径)可能会发生变化。
JCR 2.0 API 也没有定义自动生成唯一子节点名称的方法。 (JSR-333 或“JCR 2.1”即将最终采用,并将添加一种以自动方式添加具有唯一名称的子节点的方法。ModeShape 计划在 4.0 中支持 JSR-333;请查看我们的roadmap 了解时间表.)
因此,鉴于此,有两种方法可以完成您的要求,并且这两种技术在 ModeShape 集群中都能很好地工作。
标准的nt:folder 节点类型确实不允许允许具有同名兄弟姐妹的子节点。毕竟,nt:folder 和 nt:file 的设计行为类似于大多数文件系统,其中大多数不允许具有相同名称的文件/文件夹。因此,当您创建一个主要类型为 nt:folder 的节点时,每个子节点都必须有一个唯一的名称。
为孩子创建唯一名称的一种非常简单的方法是使用标准的java.util.UUID 类。只需生成一个唯一的 ID,并在新孩子的名字中使用字符串形式。
或者,如果您希望存储库通过 SNS 索引管理子节点名称的唯一性,并且可以忍受 SNS 节点的缺点,那么只需定义一个 custom node type 即可实现这一点。例如,这是一个节点类型定义,它包含子类型 nt:hierarchyNode(它是 nt:folder 和 nt:file 的超类型),因此 相似 但与 nt:folder 无关:
[acme:folder] > nt:hierarchyNode
+ * (nt:hierarchyNode) version sns
(您的自定义节点类型不需要扩展nt:hierarchyNode,但这样做可以使nt:folder 包含nt:file、nt:folder、和类型的节点@987654339 @.)
注册此节点类型定义后,只需使用该自定义类型作为主要类型创建您的文件夹节点(或稍后更改主要类型,ModeShape 确实支持)。
【讨论】:
您可以通过使用JcrUtils 来执行此操作,您可以为节点指定名称提示,即您的“fileName”和 JcrUtil 将在其前面附加一个数字,从而产生类似于“fileName0”的内容,下面将完全正确你要的是什么:
JcrUtils.getOrCreateUniqueByPath(attach, "fileName", "type goes here");
【讨论】: