将我的 POJO 保存到 Jackrabbit JCR 的最佳方法是啥?

Posted

技术标签:

【中文标题】将我的 POJO 保存到 Jackrabbit JCR 的最佳方法是啥?【英文标题】:What is the best way to save my POJOs into Jackrabbit JCR?将我的 POJO 保存到 Jackrabbit JCR 的最佳方法是什么? 【发布时间】:2010-09-27 02:24:09 【问题描述】:

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

    编写我自己的图层 和 使用 Apache Graffito

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

使用 Graffito 令人失望,因为它似乎是一个“死”项目stuck in 2006

有哪些更好的选择?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

非常有趣。我承认我并没有真正摆脱旧的“OCM 风格”的思维方式。值得深思的好食物。 为什么 OCM 没有进入 JR 1.6.0 ?它看起来已被弃用,处于休眠状态....【参考方案2】:

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

【讨论】:

感谢 XStream、Betwixt 和 Jackrabbit OCM 的指点。 你知道强迫症的现状吗?为什么它没有达到 1.6.0 版本和 JCR 2.0 规范?【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于将我的 POJO 保存到 Jackrabbit JCR 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的打印语句保存在列表中? Python [关闭]

Jackrabbit Oak 合并不保存更改

摘取作物

尝试将我的 java netbeans j 表注册表单的数据放入 MySQL 时,我不断收到错误

为啥 Python 不使用对象 .save() 将我的模型保存到数据库?

将我的变量类保存到 XML 文件