2008-12-16 8 views
10

Trong Jackrabbit tôi đã trải qua hai cách để tiết kiệm POJO tôi vào nút kho để lưu trữ trong Jackrabbit JCR:Cách tốt nhất để lưu POJO của tôi vào Jackrabbit JCR là gì?

  1. viết lớp của riêng tôi và
  2. sử dụng Apache vẽ trên tường

Viết riêng tôi mã đã được chứng minh tốn thời gian và lao động chuyên sâu (phải viết và chạy rất nhiều bài kiểm tra tự động xấu xí) mặc dù khá linh hoạt.

Sử dụng hình vẽ trên tường đã là một sự thất vọng vì nó có vẻ là một "chết" Dự án stuck in 2006

một số lựa chọn thay thế tốt hơn là gì?

Trả lời

15

Một giải pháp thay thế khác là bỏ qua hoàn toàn khung công tác OCM và chỉ cần sử dụng javax.jcr.Node làm chính DAO rất linh hoạt. Lý do cơ bản tại sao các khung công tác OCM tồn tại là bởi vì với RDBMS bạn cần một ánh xạ từ các đối tượng đến mô hình quan hệ. Với JCR, vốn đã rất hướng đối tượng (node ​​~ = object), lý do cơ bản này đã biến mất. Những gì còn lại là với DAO bạn có thể hạn chế những gì các lập trình viên của bạn có thể truy cập trong mã của họ (bao gồm cả sự giúp đỡ của tự động hoàn thành). Nhưng cách tiếp cận này không thực sự thúc đẩy khái niệm JCR, có nghĩa là lập trình không có lược đồ và linh hoạt. Sử dụng API JCR trực tiếp trong mã của bạn là cách tốt nhất để thực hiện theo khái niệm đó.

Hãy tưởng tượng bạn muốn thêm thuộc tính mới vào nút/đối tượng hiện có sau trong ứng dụng của bạn - với khung OCM, bạn phải sửa đổi nó và đảm bảo nó vẫn hoạt động bình thường. Với quyền truy cập trực tiếp vào các nút, nó đơn giản là một điểm thay đổi duy nhất. Tôi biết, đây là một cách tốt để có được vấn đề với lỗi chính tả trong ví dụ. tên thuộc tính; nhưng nỗi sợ này không thực sự được hỗ trợ bởi thực tế, vì bạn sẽ trong hầu hết các trường hợp rất nhanh chóng nhận thấy lỗi chính tả hoặc tên không phù hợp khi bạn kiểm tra ứng dụng của mình. Một giải pháp tốt là sử dụng hằng số chuỗi cho các nút chung hoặc tên thuộc tính, thậm chí là một phần của API của bạn nếu bạn hiển thị API JCR trên chúng. Điều này vẫn mang lại cho bạn sự linh hoạt để nhanh chóng thêm các thuộc tính mới mà không cần phải áp dụng các lớp OCM.

Để có một số ràng buộc về những gì được cho phép hoặc bắt buộc (nghĩa là "bán sơ đồ"), bạn có thể sử dụng loại nút và mixin (vì JCR 2.0 bạn cũng có thể thay đổi loại nút cho nội dung hiện có): có thể xử lý hoàn toàn cấp độ lưu trữ này và không phải lo lắng về việc nhập và ràng buộc bên trong mã ứng dụng của bạn - ngoài việc bắt các ngoại lệ ;-)

Nhưng, tất nhiên, lựa chọn này tùy thuộc vào yêu cầu và sở thích cá nhân của bạn .

+0

Rất thú vị. Tôi thừa nhận tôi đã không thực sự nhận được từ "phong cách OCM" tư duy cũ. Thức ăn ngon cho ý nghĩ. – Chinnery

+1

Làm thế nào mà OCM không làm được với JR 1.6.0? Nó trông không được chấp nhận, ngủ đông .... – lisak

2

Bạn có thể muốn xem Jackrabbit OCM còn sống và đá. Tất nhiên một cách khác là tự tuần tự hóa/deserialize các POJO. Đối với điều đó có nhiều tùy chọn khác nhau. Câu hỏi là liệu bạn có cần lược đồ sửa lỗi để truy vấn các đối tượng trong JCR hay không. Nếu bạn chỉ muốn tuần tự hóa thành XML thì XStream là một cách rất dễ gây hại. Nếu bạn cần một lược đồ sửa lỗi nhiều hơn thì cũng có Betwixt từ Apache Commons.

+0

Cảm ơn các con trỏ đến XStream, Betwixt và OX Jackrabbit. – Chinnery

+0

Bạn có biết trạng thái của OCM không? Tại sao nó không làm cho nó thành phiên bản 1.6.0 và đặc tả JCR 2.0? – lisak

1

Ngoài ra còn có dự án JCROM tại http://code.google.com/p/jcrom/. Dự án đó không hoạt động trong một vài năm, nhưng đã có một vài bản phát hành mới vào mùa hè năm 2013.

1

Nó phụ thuộc vào nhu cầu của bạn. Khi bạn sử dụng trực tiếp javax.jcr.node, điều đó có nghĩa là mã của bạn được kết hợp chặt chẽ với cơ chế cơ bản. Trong trung bình và thậm chí một số dự án có quy mô nhỏ, đây không phải là một ý tưởng tốt.Rõ ràng câu hỏi sẽ là làm thế nào để đi từ nút đến mô hình tên miền của riêng bạn. Vấn đề khá giống với việc chuyển từ Jdbc ResultSet sang mô hình miền của riêng bạn. Tâm trí bạn, tôi có nghĩa là từ một điểm kỹ thuật của xem vấn đề là tương tự. Từ quan điểm chức năng, có sự khác biệt rất lớn giữa việc sử dụng JDBC và JCR.

Một yếu tố quyết định khác là liệu bạn có thể áp đặt cấu trúc trong nội dung JCR của mình hay không. Một số miền ứng dụng có thể (nhưng vẫn phù hợp tốt hơn với JCR so với JDBC), trong các miền khác, nội dung có thể không được cấu trúc cao trong tự nhiên. Trong trường hợp này, OCM rõ ràng là quá mức cần thiết. Tôi vẫn còn lời khuyên để viết lớp wrapper của riêng bạn xung quanh lớp javax.jcr. *.

1

Ngoài ra còn có https://github.com/ilikeorangutans/omf, một đối tượng rất linh hoạt đối với người lập bản đồ JCR. Đáng tiếc là nó chưa có hỗ trợ ghi. Tuy nhiên chúng tôi đang sử dụng thành công khung này trong cài đặt CMS lớn.