代码之家  ›  专栏  ›  技术社区  ›  Chinnery

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

  •  10
  • Chinnery  · 技术社区  · 17 年前

    在Jackrabbit中,我经历了两种将POJO保存到存储库节点以存储在JackrabbitJCR中的方法:

    1. 写我自己的图层 和
    2. 使用Apache涂鸦

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

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

    有哪些更好的替代方案?

    5 回复  |  直到 17 年前
        1
  •  15
  •   Alexander Klimetschek    12 年前

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

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

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

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

        2
  •  2
  •   tcurdt    17 年前

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

        3
  •  1
  •   Luk Spiessens    14 年前

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

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

        4
  •  1
  •   ilikeorangutans    13 年前

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

        5
  •  1
  •   Peter Centgraf    13 年前

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