mongodbspring-datadbref

Spring data and mongoDB - inheritance and @DBRef


I have this two documents, User:

@Document(collection = "User")
public class User {
    // fields
}

and Contact:

@Document(collection = "Contact")
public class Contact extends User{
    // fields
}

and then I have a document which referes either to User oder Contact:

@Document(collection = "DocumentFile")
public class DocumentFile {

    @DBRef
    private User user;
}

So I am able to add User oder Contact in DocumentFile#user but if I set a Contact to DocumentFile#user than I lost the reference because in MongoDB DocumentFile#user is stored as "_class" : "...Contact". Is there a solution for that?


Solution

  • This is how your classes should look like to make the DBRef work with the inheritance.

    User

    @Document(collection = "User")
    public class User {
    
        @Id
        private String id;
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    Contact

    Please note you don't need Document annotation on this class.

    public class Contact extends User {
    
        private String address;
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    

    Document File

    @Document(collection = "DocumentFile")
    public class DocumentFile {
    
        @Id
        private String id;
    
        public void setId(String id) {
            this.id = id;
        }
    
        @DBRef
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
    }
    

    You'll just need the IDocumentFileRepository and IUserRepository for CRUD operations.

    Rest of the code along with the test cases have been uploaded to github.

    https://github.com/saagar2000/Spring