0

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

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

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

提前致谢

4

2 回答 2

3

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

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

因此,鉴于此,有两种方法可以完成您的要求,并且两种技术都可以在 ModeShape 集群中运行良好。

生成您自己的唯一名称

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

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

使用同名兄弟姐妹 (SNS)

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

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

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

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

于 2013-09-30T13:23:13.050 回答
1

您可以通过使用JcrUtils来执行此操作,您将能够为节点指定名称提示,即您的“fileName”和 JcrUtil 将预先附加一个数字,从而产生类似“fileName0”的内容,下面将完全按照您的要求进行:

JcrUtils.getOrCreateUniqueByPath(attach, "fileName", "type goes here");
于 2015-11-30T06:00:31.650 回答