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

Serialization 将我的POJO保存到Jackrabbit JCR中的最佳方法是什么?,serialization,jackrabbit,jcr,Serialization,Jackrabbit,Jcr,在Jackrabbit中,我体验了两种将POJO保存到存储库节点以存储在Jackrabbit JCR中的方法: 写我自己的图层 及 使用apachegraffito 事实证明,编写自己的代码既耗时又费力(必须编写和运行许多难看的自动化测试),尽管相当灵活 使用涂鸦一直令人失望,因为它似乎是一个“死”的项目 有什么更好的选择吗?您可能想看一看,它是活的,并且正在启动。当然,另一种方法是手动序列化/反序列化POJO。为此,有许多不同的选择。问题是您是否需要修复模式来查询JCR中的对象。如果您只想序列

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

  • 写我自己的图层 及
  • 使用apachegraffito
  • 事实证明,编写自己的代码既耗时又费力(必须编写和运行许多难看的自动化测试),尽管相当灵活

    使用涂鸦一直令人失望,因为它似乎是一个“死”的项目


    有什么更好的选择吗?

    您可能想看一看,它是活的,并且正在启动。当然,另一种方法是手动序列化/反序列化POJO。为此,有许多不同的选择。问题是您是否需要修复模式来查询JCR中的对象。如果您只想序列化为XML,那么这是一种非常轻松的方式。如果您需要一个更固定的模式,还有来自ApacheCommons的解决方案。

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

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

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


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

    还有JCROM项目。该项目暂停了几年,但截至2013年夏季,已有一些新版本发布。

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


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

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

    感谢您提供指向XStream、Betwixt和Jackrabbit OCM的指针。您知道OCM的状态吗?为什么它没有达到1.6.0版本和JCR2.0规范?非常有趣。我承认我还没有真正摆脱旧的“OCM风格”的思维方式。很值得思考。为什么OCM没有达到JR1.6.0?它看起来不受欢迎,处于休眠状态。。。。