2015-01-19 19 views
6

Có hai loại đối tượng, được ánh xạ tới hai lớp Java trong bộ sưu tập MongoDB duy nhất:Repositories mùa xuân dữ liệu MongoDB không thực hiện thừa kế một cách chính xác

@Document 
public class Superclass { ... } 

@Document(collection = "superclass") 
public class Subclass extends Superclass { ... } 

và hai kho đối với những thực thể:

public interface SuperclassRepository extends MongoRepository<Superclass, String> {} 
public interface SubclassRepository extends MongoRepository<Subclass, String> {} 

MongoRepositories không xử lý việc thừa kế của các thực thể một cách chính xác. Trong khi truy vấn cho tất cả các đối tượng Subclass (ví dụ SubclassRepository.findAll()) tập hợp kết quả chứa các đối tượng Superclass, được khởi tạo (hoặc ít nhất đã được cố gắng khởi tạo) với giá trị null cho các trường là một phần của Subclass, nhưng không phải là một phần của Superclass .

Kết quả dự kiến ​​sẽ là SubclassRepository nên quay lại chỉ Subclass đối tượng, trong khi SuperclassRepository nên trở SuperclassSubclass đối tượng. Nó hoạt động theo cách này trong Spring JPA dữ liệu.

Có ai gặp phải lỗi này và có giải pháp nào về cách sửa lỗi không?

+0

Tôi đã tạo [ticket] (https://jira.spring.io/brows e/DATAMONGO-1142) và [yêu cầu kéo] (https://github.com/spring-projects/spring-data-mongodb/pull/266) cho lỗi đó. –

Trả lời

3

Tôi gặp phải sự cố tương tự.

Hãy xem mã nguồn và tôi ngạc nhiên rằng đó là loại không được triển khai. Nó thêm tên Bộ sưu tập và lớp thực thể nhưng không được chèn vào truy vấn cuối cùng thuộc tính _class. Và sau khi nhìn vào nó, tôi nhận ra rằng Mongo sẽ biết rằng SubClass1 hoặc Subclass2 bắt nguồn từ SuperClass như thế nào. Vì vậy, tôi chỉ ghi đè lên lớp SimpleMongoRepository và tạo Nhà máy của riêng tôi mà đặt lớp thay vì mặc định SimpleMongoRepository

đây những gì tôi nói thêm:

public MySimpleMongoRepository(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) { 

    Assert.notNull(mongoOperations); 
    Assert.notNull(metadata); 

    this.entityInformation = metadata; 
    this.mongoOperations = mongoOperations; 
    Reflections reflections = new Reflections("com.cre8techlabs.entity"); 
    Set<String> subTypes = reflections.getSubTypesOf(entityInformation.getJavaType()).stream().map(Class::getName).collect(Collectors.toSet()); 
    subTypes.add(entityInformation.getJavaType().getName()); 
    this.baseClassQuery = Criteria.where("_class").in(subTypes.toArray()); 
} 

Và đây là một ví dụ về việc thực hiện một tìm

public T findOne(ID id) { 
    Assert.notNull(id, "The given id must not be null!"); 
    Query q = getIdQuery(id).addCriteria(baseClassQuery); 

    return mongoOperations.findOne(q, entityInformation.getJavaType(), entityInformation.getCollectionName()); 
} 

Nó làm việc cho tôi, tôi chỉ sợ rằng phải mất nhiều thời gian hơn

+1

Lý tưởng sẽ là thay đổi QueryMapper, nhưng nó sẽ có nghĩa là thay đổi MongoTemplate –

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