在兔崽子我已經經歷了兩個辦法救我的POJO到倉庫節點,用於存儲在兔崽子JCR:將我的POJO保存到Jackrabbit JCR中的最佳方式是什麼?
- 編寫使用Apache亂畫
寫我自己的我自己的層 和
使用亂畫一直令人失望,因爲它似乎是一個「死」項目stuck in 2006
都有些什麼更好的方法?
在兔崽子我已經經歷了兩個辦法救我的POJO到倉庫節點,用於存儲在兔崽子JCR:將我的POJO保存到Jackrabbit JCR中的最佳方式是什麼?
寫我自己的我自己的層 和
使用亂畫一直令人失望,因爲它似乎是一個「死」項目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。
還有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安裝中成功使用此框架。
感謝您指點XStream,Betwixt和Jackrabbit OCM。 – Chinnery 2008-12-16 16:15:39
你知道OCM的狀態是什麼嗎?爲什麼它沒有達到1.6.0版本和JCR 2.0規範? – lisak 2011-06-18 14:42:44