10

在 Jackrabbit 中,我体验了两种将 POJO 保存到存储库节点以存储在 Jackrabbit JCR 中的方法:

  1. 写我自己的层和
  2. 使用 Apache Graffito

事实证明,编写我自己的代码既费时又费力(不得不编写和运行许多丑陋的自动化测试),但非常灵活。

使用 Graffito 令人失望,因为它似乎是一个停留在 2006 年的“死”项目

有哪些更好的选择?

4

5 回答 5

15

另一种选择是完全跳过 OCM 框架并简单地将javax.jcr.Node其用作非常灵活的 DAO 本身。OCM 框架存在的根本原因是,使用 RDBMS,您需要从对象到关系模型的映射。使用 JCR,它已经非常面向对象(节点 ~= 对象),这个根本原因就没有了。剩下的就是使用 DAO,您可以限制程序员可以在其代码中访问的内容(包括自动完成的帮助)。但是这种方法并没有真正利用 JCR 概念,这意味着无模式和灵活的编程。直接在您的代码中使用 JCR API 是遵循该概念的最佳方式。

想象一下,您想在应用程序生命周期的后期向现有节点/对象添加新属性——使用 OCM 框架,您还必须对其进行修改并确保它仍然正常工作。通过直接访问节点,它只是一个单点更改。我知道,这是解决例如拼写错误问题的好方法。属性名称;但是这种恐惧并没有真正得到现实的支持,因为在大多数情况下,当您测试您的应用程序时,您会很快注意到拼写错误或不匹配的名称。一个好的解决方案是为公共节点或属性名称使用字符串常量,即使您在它们之间公开 JCR API,也可以将其作为 API 的一部分。这仍然使您可以灵活地快速添加新属性,而无需采用 OCM 层。

为了对允许或强制(即“半模式”)有一些限制,您可以使用节点类型和混合(从 JCR 2.0 开始,您还可以更改现有内容的节点类型):因此您可以完全处理这个在存储库级别,不必关心应用程序代码中的类型和约束——除了捕获异常;-)

但是,当然,这种选择取决于您的要求和个人喜好。

于 2008-12-16T12:26:48.917 回答
2

您可能想看看活生生的Jackrabbit OCM。当然另一种方法是手动序列化/反序列化 POJO。为此,有许多不同的选择。问题是您是否需要修复模式来查询 JCR 中的对象。如果您只想序列化为 XML,那么XStream是一种非常轻松的方式。如果您需要更多修复模式,还有来自 Apache Commons的Betwixt 。

于 2008-12-16T08:57:36.170 回答
1

在http://code.google.com/p/jcrom/也有 JCROM 项目。该项目休眠了几年,但截至 2013 年夏天已经发布了一些新版本。

于 2011-01-17T18:30:02.303 回答
1

这取决于您的需求。当您直接使用 javax.jcr.node 时,这意味着您的代码与底层机制高度耦合。在中型甚至一些小型项目中,这不是一个好主意。显然,问题将是如何从 Node 转到您自己的域模型。这个问题与从 Jdbc ResultSet 到您自己的域模型非常相似。请注意,我的意思是从技术角度来看,问题是相似的。从功能的角度来看,使用 JDBC 和 JCR 之间存在巨大差异。

另一个决定因素是您是否可以在 JCR 内容中强加结构。一些应用程序域可以(但仍然比 JDBC 与 JCR 匹配得更好),在其他域中,内容本质上可能是高度非结构化的。在这种情况下,强迫症显然是矫枉过正的。我仍然建议围绕 javax.jcr.* 类编写自己的包装层。

于 2012-04-02T11:07:14.323 回答
1

还有https://github.com/ilikeorangutans/omf,一个非常灵活的 JCR 映射器对象。不幸的是,它还没有写支持。然而,我们在大型 CMS 安装中成功地使用了这个框架。

于 2013-04-03T17:25:13.700 回答