我需要将一些节点[file]添加到节点[folder]。但也许其中一些具有相同的名称。 像这样:
附\ FILENAME1
附加\文件名2
附上\ FILENAME1
我想拥有一个唯一的ID(主键)而不是文件名,因为我在另一个节点中使用此路径。有没有办法在JCR中创建自动生成的ID?或者我必须以务实的方式管理它?
提前致谢
答案 0 :(得分:3)
JCR对具有相同名称的子节点的标准方法是使用同名兄弟或SNS(请参阅here和here)。但是,通常不鼓励使用它们,因为当移动,重命名,插入和删除节点的子节点时,给定子节点的同名兄弟索引(以及路径)可能会发生变化。
JCR 2.0 API也没有定义自动生成唯一子节点名称的方法。 (JSR-333,或者#34; 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
,和 acme:folder
。)
注册此节点类型定义后,只需创建具有该自定义类型作为主要类型的文件夹节点(或稍后更改主要类型,ModeShape支持)。
答案 1 :(得分:0)
您可以使用JcrUtils来指定节点的名称提示,即您的“fileName”和JcrUtil会为其预先添加一个数字,从而产生类似“fileName0”的内容,如下所示完全按照你的要求行事:
JcrUtils.getOrCreateUniqueByPath(attach, "fileName", "type goes here");