在Jackrabbit中,我有两种方法可以将我的POJO保存到存储库节点中,以便存储在Jackrabbit JCR中:
编写我自己的代码已经证明是耗时且耗费人力的(必须编写并运行许多丑陋的自动化测试),尽管非常灵活。
使用Graffito令人失望,因为它似乎是一个“死”项目stuck in 2006
有哪些更好的选择?
答案 0 :(得分:15)
另一种选择是完全跳过OCM框架,只需使用javax.jcr.Node
作为一个非常灵活的DAO本身。 OCM框架存在的根本原因是因为使用RDBMS,您需要从对象到关系模型的映射。对于已经非常面向对象的JCR(node~ = object),这个潜在的原因已经消失。剩下的就是使用DAO可以限制程序员在代码中访问的内容(包括自动完成的帮助)。但是这种方法并没有真正利用JCR概念,这意味着无架构且灵活的编程。直接在代码中使用JCR API是遵循该概念的最佳方式。
想象一下,您希望在应用程序的生命周期中向现有节点/对象添加新属性 - 使用OCM框架,您还必须对其进行修改并确保它仍能正常工作。通过直接访问节点,它只是一个单一的变化点。我知道,这是一个很好的方法来解决例如错别字的问题。财产名称;但是这种恐惧并没有真正得到现实的支持,因为在大多数情况下,当您测试应用程序时,您会很快发现拼写错误或不匹配的名称。一个好的解决方案是使用字符串常量作为公共节点或属性名称,如果您在它们之间公开JCR API,甚至作为API的一部分。这仍然可以让您灵活地快速添加新属性,而无需采用OCM层。
对于允许的内容或必须的内容(即“半模式”),您可以使用节点类型和mixins(因为JCR 2.0也可以更改现有内容的节点类型):因此您可以在存储库级别完全处理这个问题,并且不必关心应用程序代码中的输入和约束 - 除了捕获异常; - )
但是,当然,这种选择取决于您的要求和个人偏好。
答案 1 :(得分:2)
你可能想看一下活着和踢的Jackrabbit OCM。当然,另一种方法是手动序列化/反序列化POJO。为此,有许多不同的选择。问题是您是否需要修复模式来查询JCR中的对象。如果您只想序列化为XML,那么XStream是一种非常轻松的方法。如果您需要更多的修复架构,那么Apache Commons也会提供Betwixt。
答案 2 :(得分:1)
http://code.google.com/p/jcrom/还有JCROM项目。该项目已经休眠了几年,但截至2013年夏季已有一些新版本。
答案 3 :(得分:1)
这取决于您的需求。当您直接使用javax.jcr.node时,这意味着您的代码与底层机制紧密耦合。在中型甚至是一些小型项目中,这不是一个好主意。显然,问题是如何从节点转到您自己的域模型。问题与从Jdbc ResultSet到您自己的域模型非常相似。请注意,我的意思是从技术角度看问题是类似的。从功能的角度来看,使用JDBC和JCR之间存在巨大差异。
另一个决定性因素是你是否可以在你的JCR内容中强加一个结构。某些应用程序域可以(但仍然与JCR匹配得比JDBC更好),在其他域中,内容可能本质上是高度非结构化的。在这种情况下,OCM显然有点过分。我仍然建议在javax.jcr。* classes周围编写自己的包装层。
答案 4 :(得分:1)
还有https://github.com/ilikeorangutans/omf,一个非常灵活的JCR映射器对象。不幸的是它还没有写支持。但是,我们在大型CMS安装中成功使用此框架。