我需要将一些节点 [文件] 添加到节点 [文件夹]。但也许其中一些具有相同的名称。像这样:
附加\文件名
1 附加\文件名2
附加\文件名1
我想要一个唯一的 ID(主键)而不是文件名,因为我在另一个节点中使用了这个路径。有没有办法在 JCR 中创建类似于自动生成的 ID 的东西?还是我必须务实地管理它?
提前致谢
JCR 对具有相同名称的子节点的标准方法是使用同名兄弟或 SNS(请参阅此处和此处)。但是,通常不鼓励使用它们,因为随着节点的子节点被移动、重命名、插入和删除,给定子节点的同名兄弟索引(以及路径)可能会发生变化。
JCR 2.0 API 也没有定义自动生成唯一子节点名称的方法。(JSR-333 或“JCR 2.1”即将最终采用,并将添加一种以自动方式添加具有唯一名称的子节点的方法。ModeShape 计划在 4.0 中支持 JSR-333;请查看我们的路线图以了解时间表。)
因此,鉴于此,有两种方法可以完成您的要求,并且两种技术都可以在 ModeShape 集群中运行良好。
标准nt:folder
节点类型不允许具有同名兄弟的子节点。毕竟,nt:folder
和nt:file
where 设计的行为与大多数文件系统一样,并且其中大多数不允许具有相同名称的文件/文件夹。因此,当您创建一个主要类型为 的节点时nt:folder
,每个子节点都必须有一个唯一的名称。
为孩子创建唯一名称的一种非常简单的方法是使用标准java.util.UUID
类。只需生成一个唯一的 ID,并在新孩子的名字中使用字符串形式。
或者,如果您希望存储库通过 SNS 索引管理子节点名称的唯一性,并且可以忍受 SNS 节点的缺点,那么只需定义一个自定义节点类型即可。例如,这是一个节点类型定义,它具有子类型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 确实支持)。
您可以通过使用JcrUtils来执行此操作,您将能够为节点指定名称提示,即您的“fileName”和 JcrUtil 将预先附加一个数字,从而产生类似“fileName0”的内容,下面将完全按照您的要求进行:
JcrUtils.getOrCreateUniqueByPath(attach, "fileName", "type goes here");