短版:文档是结构化或半结构化的内容。这就是分层组织的数据存储的用例。如果您不想为自己实现所有基本的 dms/cms 东西,您应该选择 JCR(考虑到这一点,您可能是第一次这样做,而他们一直在这样做)。
长版:JCR 按规范涵盖了文档或内容管理系统的大部分基本用例,例如版本控制、锁定、生命周期管理或引用完整性。此外,它允许您在不更改架构的情况下扩展数据(当然您可以在模型中定义节点类型,但您不必这样做)。大多数 JCR 实现(如 Jackrabbit)在后端使用数据库,使它们比关系后端的抽象层“多一点”。为了处理大数据,您可以在将结构化数据(节点和属性)存储在数据库中的同时使用文件系统存储(这比将每个二进制数据存储到数据库中要快得多)。
当你去 JPA 时,你必须自己处理所有这些 dms/cms 的东西。当然可以,但在 JCR 实现中已经完成了更多的低级编程。每个模型更改都需要架构更改,并且表格布局并不是那么简单(您是否希望为您的文档提供一个大表格,每个属性都是一个列?您是否希望为每个文档类创建一个单独的表格?如何您是否对生命周期进行建模,如何对版本控制进行建模?)
对于 JCR 的第一跳,我推荐David's Model,将应用程序的所有内容都视为内容。我曾在一个项目中工作,我们决定不混合使用 JCR 和 JPA,这样我们就不必处理不同的存储 API。
至少有一些 JCR 实现
- Jackrabbit 2(参考实现,针对读取操作进行了优化,目前处于维护模式)
- Jackrabbit OAK(针对高度可扩展的内容存储库,具有读/写性能的平衡。它来自与 Jackrabbit 相同的核心团队)
- Jackrabbit FileVault(后端纯粹在文件系统上)
- Modeshape(替代实现,快速且可扩展,带有 REST API,相当好的文档)
顺便提一句。JCR API 和实现在很大程度上考虑了 RESTful 架构。因此,如果您考虑 REST API,映射也相当简单。此外,它允许消费者直接通过 JCR API 探索内容,从而可以轻松地将内容集成到其他应用程序中(即只读),而您必须使用 JPA 揭示数据库的内部设计,从而使消费者合同更有可能被打破关于变化。
关于您剩下的问题:
- 我没有比较图表,并且像往常一样,它取决于数据结构和索引以及您的查询设计。JCR 实现具有内置缓存,您通常会迭代结果集。所以没有关于更快/更慢的一般性声明,这完全取决于用例。
- 我做过类似的事情,我们对 Jackrabbit 的实现很满意,但我们使用的是 JDK7。我们在存储库中有所有数据(包括用户设置、应用程序设置等),根本没有 JPA 持久性。如果需要,还可以使用对象内容映射。
- 是的,值得介绍。Jackrabbit 拥有自己的用户管理功能——您不必自己实现。访问控制可通过 JCR API 和 JAAS 获得。尽管我建议不要使用 JCA ResourceAdapter 来管理用户管理和访问控制,因为它不会公开 Jackrabbit API。
- 关于数据完整性和备份的问题对于 JCR 或 JPA 来说并不特殊,它们都确保了某种级别的完整性(数据库完整性,JCR 执行引用完整性)并且两者都可以备份(db 备份,fs 备份)。两者都是访问数据的标准化方式,因此您甚至可以执行自己的备份逻辑。