Spring data and mongoDB - inheritance and @DBRef

2.7k views Asked by At

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?

1

There are 1 answers

0
s7vr On BEST ANSWER

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