将我的POJO保存到Jackrabbit JCR中的最佳方式是什么?

问题描述:

在兔崽子我已经经历了两个办法救我的POJO到仓库节点,用于存储在兔崽子JCR:将我的POJO保存到Jackrabbit JCR中的最佳方式是什么?

  1. 编写使用Apache乱画

写我自己的我自己的层 和

  • 代码已经被证明是耗时且耗费人力的(不得不编写和运行很多丑陋的自动化测试),虽然相当灵活。

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

    都有些什么更好的方法?

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

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

    对于什么是允许的或什么是必需的(即“半模式”),您可以使用节点类型和混合(从JCR 2.0开始,您也可以更改现有内容的节点类型):因此,您可以在存储库级别完全处理这个问题,并且不必关心应用程序代码中的键入和约束 - 除了捕获异常外;-)

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

    你可能想看看Jackrabbit OCM这是活着的,并kickin。当然另一种方法是手动序列化/反序列化POJO。为此,有许多不同的选择。问题是您是否需要修复架构来查询JCR中的对象。如果你只是想序列化成XML,那么XStream是一个非常轻松的方法。如果您需要更多修复架构,Apache Commons也提供Betwixt

    +0

    感谢您指点XStream,Betwixt和Jackrabbit OCM。 – Chinnery 2008-12-16 16:15:39

    +0

    你知道OCM的状态是什么吗?为什么它没有达到1.6.0版本和JCR 2.0规范? – lisak 2011-06-18 14:42:44

    还有JCROM项目http://code.google.com/p/jcrom/。该项目已进入休眠状态几年,但截至2013年夏季已有几个新版本。

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

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

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