Mongo polymorphic preservation

  mongodb

Org

public class Org {

    @Id
    private String id;

    private String name;

    private Set<Employee> employees;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<Employee> employees) {
        this.employees = employees;
    }
}

employee

public abstract class Employee {

    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

leader

public class Leader extends Employee{

    private String address;

    private String title;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

worker

public class Worker extends Employee{

    private String mobile;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}

Save instance

@Test
    public void testPolymorphic() {
        Org org = new Org();
        org.setName("tech");

        Leader leader = new Leader();
        leader.setName("leader");
        leader.setAddress("fj");
        leader.setTitle("vp");

        Worker worker = new Worker();
        worker.setName("worker");
        worker.setMobile("15909898989");

        Set<Employee> employees = new HashSet<>();
        employees.add(leader);
        employees.add(worker);

        org.setEmployees(employees);
        orgDao.save(org);
    }

The data in mongo is stored in class

{
    "_id" : ObjectId("57f635e0af7b3807e8101884"),
    "_class" : "com.codecraft.demo.model.Org",
    "name" : "tech",
    "employees" : [ 
        {
            "mobile" : "15909898989",
            "name" : "worker",
            "_class" : "com.codecraft.demo.model.Worker"
        }, 
        {
            "address" : "fj",
            "title" : "vp",
            "name" : "leader",
            "_class" : "com.codecraft.demo.model.Leader"
        }
    ]
}

data fetch

@Test
    public void testFind(){
        Org org = orgDao.findOne("57f635e0af7b3807e8101884");
        Set<Employee> employees = org.getEmployees();
        for(Employee emp : employees){
            if(emp instanceof Leader){
                System.out.println(emp);
            }else if(emp instanceof Worker){
                System.out.println(emp);
            }
        }
    }

docs