在Jackrabbit中,我经历了两种方法将我的POJO保存到存储库节点中以便存储在Jackrabbit JCR中:
写我自己的图层和
使用Apache Graffito
编写我自己的代码已经证明是耗时且劳动密集的(必须编写并运行许多丑陋的自动化测试),尽管非常灵活.
使用Graffito令人失望,因为它似乎是一个陷入2006年的"死"项目
有哪些更好的选择?
另一种方法是完全跳过OCM框架,并简单地将其javax.jcr.Node
用作非常灵活的DAO本身.OCM框架存在的根本原因是因为使用RDBMS,您需要从对象到关系模型的映射.对于已经非常面向对象(节点〜=对象)的JCR,这个潜在的原因消失了.剩下的就是使用DAO可以限制程序员在代码中访问的内容(包括自动完成的帮助).但是这种方法并没有真正利用JCR概念,这意味着无模式和灵活的编程.直接在代码中使用JCR API是遵循该概念的最佳方式.
想象一下,您希望在应用程序的生命周期中向现有节点/对象添加新属性 - 使用OCM框架,您还必须对其进行修改并确保它仍能正常工作.通过直接访问节点,它只是一个单一的变化点.我知道,这是一个很好的方法来解决例如错别字的问题.财产名称; 但是这种恐惧并没有真正得到现实的支持,因为在大多数情况下,当您测试应用程序时,您会很快发现拼写错误或不匹配的名称.一个好的解决方案是使用字符串常量作为公共节点或属性名称,如果您在它们之间公开JCR API,甚至作为API的一部分.这仍然可以让您灵活地快速添加新属性,而无需采用OCM层.
由于对允许的内容或必需的内容(即"半模式")有一些限制,您可以使用节点类型和混合(因为JCR 2.0也可以更改现有内容的节点类型):因此您可以完全处理在存储库级别,不必关心应用程序代码中的输入和约束 - 除了捕获异常;-)
但是,当然,这种选择取决于您的要求和个人喜好.