2013-07-18 12 views
11

Tôi khá mới với mongodb và morphia, sau khi bắt đầu sử dụng nó, tôi nhận ra rằng có một phần phụ trong tài liệu mongodb, hồ sơ có chứa một tên nộp " ClassName "với giá trị của lớp mà morphia ánh xạ.một tên trường "ClassName" đang được chèn vào mongodb bởi morphia

{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"} 

là bình thường? tôi cảm thấy nó vi phạm tính toàn vẹn của dữ liệu trong db, có anyway để có được xung quanh nó?

Trả lời

18

Bạn rõ ràng có thể vô hiệu hóa các className thuộc tính: @Entity(noClassnameStored = true)

Tôi thường đang đàn áp các thuộc tính, nếu có một lớp thực thể duy nhất. Nếu tôi subclassing thực thể của tôi, tôi rõ ràng cho phép nó (đó là mặc định, nhưng chỉ để chắc chắn).

Nếu tôi không nhầm, Morphia đủ thông minh để đoán phân lớp chính xác dựa trên các thuộc tính ngay cả khi không có className (dựa trên sự phản ánh). Vì vậy, nếu bạn có một thuộc tính mongoKnowledge trong bạn lớp con Developer của Person và lớp con Manager không có nó, nha phiến sẽ biết rằng tài liệu với mongoKnowledge phải của lớp Developer. Vì vậy, nói đúng cách className chỉ được yêu cầu nếu các lớp con của bạn có cùng thuộc tính; tuy nhiên, tôi sẽ không dựa vào nó quá nhiều.

Tôi chưa cố gắng đổi tên các lớp thực thể, nhưng có thể nó sẽ gây ra sự cố. Có một vấn đề tồn tại lâu dài để cung cấp chú thích @Polimorphic và để sửa nó cùng với điều đó. Xem https://code.google.com/p/morphia/issues/detail?id=22

1

Điều này là bình thường. Vì Morphia hỗ trợ Đa hình, có nghĩa là các lớp con sẽ được lưu trữ trong cùng một bộ sưu tập mà lớp siêu được duy trì. Để phân biệt/lọc trong khi truy vấn và lưu trữ, nó sử dụng trường này. Hy vọng bạn sẽ sử dụng Morphia để truy vấn. Bạn nghĩ thế nào, nó ảnh hưởng đến tính toàn vẹn của dữ liệu của bạn, vì bạn có thể dễ dàng lọc nó ra.

Hibernate cũng vậy, có cột phân biệt đối xử để hỗ trợ đa hình.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-discriminator

+0

điều gì xảy ra nếu sau này tôi thay đổi tên của lớp học? tên refactoring xảy ra khá thường xuyên, tôi có phải đi qua tất cả các hồ sơ và cập nhật tất cả? – nightograph

+0

Có, bạn phải – Faliorn