Your problem it to merge two POJO classes.
For example
class Server {
    private String ipAddr;
    private String hw1;
    private String hw2;
    private String hw3;
    //Getter and Setters
}
Server s1 = new Server("0A", "a1", null, null);
Server s2 = new Server("0A", null, "b2", null);
So the merged pojo should be like this.
Server merged = merge(s1, s2);// Server{ipAddr=0A, hw1=a1, hw2=b2, hw3=null}
The merge function looks like this...
public static Server merge(Server s1, Server s2) throws Exception {
    Server merged = new Server();
    for (Field field : Server.class.getDeclaredFields()) {
        field.setAccessible(true);
        Object getS1 = field.get(s1);
        Object getS2 = field.get(s2);
        if(getS1 == null && getS2 != null) {
            field.set(merged, getS2);
        } else if (getS1 != null && getS2 == null) {
            field.set(merged, getS1);
        } else {  //equal values
            field.set(merged, getS1);
        }
    }
    return merged;
}
Here is the example code to merge three maps, Its kinda quick and dirty but works well.
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
class MergeMaps {
public static void main(String[] args) throws Exception {
    Map<String, Server> map1 = new HashMap<>();
    Map<String, Server> map2 = new HashMap<>();
    Map<String, Server> map3 = new HashMap<>();
    // Add some test data to map 1
    map1.put("serv1", new Server("0A", "a1", null, null));
    map1.put("serv2", new Server("0B", "b1", null, null));
    System.out.println(map1);
    // Add some data to map 2
    map2.put("serv1", new Server("0A", null, "a2", null));
    map2.put("serv2", new Server("0B", null, "b2", null));
    map2.put("serv3", new Server("0C", null, "c2", null));
    System.out.println(map2);
    // Add some data to map 3
    map3.put("serv1", new Server("0A", null, null, "a3"));
    map3.put("serv2", new Server("0B", null, null, "b3"));
    map3.put("serv3", new Server("0C", null, null, "c3"));
    map3.put("serv4", new Server("0D", null, null, "d4"));
    System.out.println(map3);
    Map<String, Server> resultingMap = new HashMap<>();
    resultingMap.putAll(map1);
    for (Map.Entry<String, Server> entry : map2.entrySet()) {
        if (resultingMap.containsKey(entry.getKey())) {
            Server s = resultingMap.get(entry.getKey());
            Server t = entry.getValue();
            Server merged = merge(s, t);
            resultingMap.put(entry.getKey(), merged);
        } else {
            resultingMap.put(entry.getKey(), entry.getValue());
        }
    }
    for (Map.Entry<String, Server> entry : map3.entrySet()) {
        if (resultingMap.containsKey(entry.getKey())) {
            Server server1 = resultingMap.get(entry.getKey());
            Server server2 = entry.getValue();
            Server merged = merge(server1, server2);
            resultingMap.put(entry.getKey(), merged);
        } else {
            resultingMap.put(entry.getKey(), entry.getValue());
        }
    }
    System.out.println(resultingMap);
}
public static Server merge(Server s1, Server s2) throws Exception {
    Server merged = new Server();
    for (Field field : Server.class.getDeclaredFields()) {
        field.setAccessible(true);
        Object getS1 = field.get(s1);
        Object getS2 = field.get(s2);
        if (getS1 == null && getS2 != null) {
            field.set(merged, getS2);
        } else if (getS1 != null && getS2 == null) {
            field.set(merged, getS1);
        } else {
            field.set(merged, getS1);
        }
    }
    return merged;
}
}
class Server {
    private String ipAddr;
    private String hw1;
    private String hw2;
    private String hw3;
    public Server() {
    }
    public Server(String ipAddr, String hw1, String hw2, String hw3) {
        this.ipAddr = ipAddr;
        this.hw1 = hw1;
        this.hw2 = hw2;
        this.hw3 = hw3;
    }
    //Getter and setters
    @Override
    public String toString() {
        return "Server{" + "ipAddr=" + ipAddr + ", hw1=" + hw1 + ", hw2=" + hw2 +     ", hw3=" + hw3 + '}';
}
}
The output looks like this..
{serv2=Server{ipAddr=0B, hw1=b1, hw2=null, hw3=null}, serv1=Server{ipAddr=0A, hw1=a1, hw2=null, hw3=null}}
{serv2=Server{ipAddr=0B, hw1=null, hw2=b2, hw3=null}, serv3=Server{ipAddr=0C, hw1=null, hw2=c2, hw3=null}, serv1=Server{ipAddr=0A, hw1=null, hw2=a2, hw3=null}}
{serv2=Server{ipAddr=0B, hw1=null, hw2=null, hw3=b3}, serv3=Server{ipAddr=0C, hw1=null, hw2=null, hw3=c3}, serv4=Server{ipAddr=0D, hw1=null, hw2=null, hw3=d4}, serv1=Server{ipAddr=0A, hw1=null, hw2=null, hw3=a3}}
{serv2=Server{ipAddr=0B, hw1=b1, hw2=b2, hw3=b3}, serv3=Server{ipAddr=0C, hw1=null, hw2=c2, hw3=c3}, serv4=Server{ipAddr=0D, hw1=null, hw2=null, hw3=d4}, serv1=Server{ipAddr=0A, hw1=a1, hw2=a2, hw3=a3}}