JCR -ModeShape:创建唯一的节点名称

时间:2013-09-30 11:27:58

标签: nodes jcr modeshape

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

附\ FILENAME1
附加\文件名2
附上\ FILENAME1

我想拥有一个唯一的ID(主键)而不是文件名,因为我在另一个节点中使用此路径。有没有办法在JCR中创建自动生成的ID?或者我必须以务实的方式管理它?

提前致谢

2 个答案:

答案 0 :(得分:3)

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

JCR 2.0 API也没有定义自动生成唯一子节点名称的方法。 (JSR-333,或者#34; 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:folderacme:folder。)

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

答案 1 :(得分:0)

您可以使用JcrUtils来指定节点的名称提示,即您的“fileName”和JcrUtil会为其预先添加一个数字,从而产生类似“fileName0”的内容,如下所示完全按照你的要求行事:

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