2012-01-09 33 views
9

Tôi muốn lưu trữ dữ liệu khác nhau vào một bộ sưu tập trong MongoDb và có hạt dữ liệu Spring với trường thích hợp ..Dữ liệu mùa xuân MongoDb cho kế thừa lớp

Xin lỗi, tôi đã bỏ qua chi tiết.

đậu phụ huynh:

class A 
    int a 

Childs:

class B extends A 
    double b 

class C extends A 
    String c 

Vì vậy, có tài liệu sau đây Mongo

{a : 1, b : 2.3, c : "Test"} 

Khi tôi lấy dữ liệu, nó là ok. Tuy nhiên, khi tôi gọi tiết kiệm phương pháp từ CrudRepository cho B, nó sẽ ghi lại tất cả dữ liệu và tôi đã làm mất C.

Tôi biết chỉ có một lựa chọn tốt để tạo ra tùy chỉnh phương pháp tiết kiệm với bản cập nhật gia tăng, chẳng hạn như

update.set("b", newvalue)... 

nhưng với sự phản ánh.

Bạn có ý tưởng nào khác không?

Xin cảm ơn trước.

+1

Bạn có phiền hơn một chút về sự tương tác với 'MongoTemplate' và kho lưu trữ của bạn không? Bạn đang đọc dữ liệu trở lại vào một đối tượng 'B'? Điều đó sẽ thực sự trả về một đối tượng kiểu 'C' vì chúng ta nên phát hiện thông tin kiểu được lưu trữ. Ngoài ra, thông tin lập bản đồ bộ sưu tập sẽ hữu ích. Đảm bảo tất cả các lớp được ánh xạ tới cùng một bộ sưu tập. –

+0

Xin chào Oliver, cảm ơn vì câu trả lời của bạn. Có, tôi đã ghi đè phương thức 'lưu' của 'MongoTemplate' để sử dụng truy vấn cập nhật. Bây giờ khi tôi lưu 'B', nó chỉ cập nhật các trường 'B'. Nhưng tôi cố gắng tìm giải pháp tuyệt vời hơn ... –

+0

Nếu bạn thêm đoạn mã có liên quan, chúng tôi có thể đi sâu vào vấn đề này thêm một chút :) –

Trả lời

5

Đối với dữ liệu Spring MongoTemplate, bổ sung vào các trường trong đối tượng của bạn, một lớp học bổ sung cũng được lưu để cho biết mẫu mà lớp đó đang lưu.
Bạn sẽ không thể lưu đối tượng một cách chính xác bằng cách sử dụng kho lưu trữ của đối tượng khác, bất kể của mối quan hệ thừa kế.

CrudRepository for Spring thực chất là mẫu Generic Dao. Vì tất cả dao của bạn thực hiện giao diện và có phương thức lưu, bạn sẽ có thể lưu bất kỳ đối tượng nào bằng cách biết dao nào sẽ sử dụng. Để làm điều này, bạn có thể tạo một RepositoryFactory được sử dụng để khởi tạo kho lưu trữ của bạn, cung cấp một hàm getRepository (loại lớp) cung cấp cho bạn kho lưu trữ thích hợp cho lớp của bạn. Sau đó, bạn sẽ có thể làm điều gì đó như:

repositoryFactory.getRepository(myType.getClass()).save(myType); 

Bạn có thể tìm thêm chi tiết ở đây: http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

Nếu bạn muốn lưu trữ tất cả các đối tượng của bạn trong bộ sưu tập tương tự, bạn có thể sử dụng @Document chú thích (collection = "mycollection"). Nếu bạn không cung cấp tên bộ sưu tập, mặc định là lưu từng lớp trong một bộ sưu tập riêng biệt theo tên lớp.

Các vấn đề liên quan