开发者

problem with putting hash map into another collection

  1. In the below code the child hashmap when printed within loop shows correct value but when the parent hashmap is printed outside the loop the child hashmap is showing a map with only the values of last entry overiding all the values开发者_如何学运维.

        public void compareOracleMySQLData() throws SQLException {
        String inputTableName = ConfigurationManager.getProperty("table_name");
    
        int i = 0;
        int j = 0;
        int colCount = 0;
        int oracleRowCount = 0;
        int mysqlRowCount = 0;
        String primaryKeyIni = null;
        String appendStuff = null;
        Connection conO = DBManager.openDbConnection("mysql");
        Connection conM = DBManager.openDbConnection("mysql");
        Statement stmtO = null;
        Statement stmtM = null;
        ResultSet resultSetO = null;
        ResultSet resultSetM = null;
        ArrayList<String> primaryKeyList = new ArrayList<String>();
        Iterator<String> primaryKeyListItr = null;
        HashMap<Object, Object> oraRowDetailsMap = new HashMap<Object, Object>();
        HashMap<String, Object> mysqlRowDetailsMap = new HashMap<String, Object>();
        Map<String, Object> oraRowPrimaryMap = new HashMap<String, Object>();
        HashMap<String, HashMap<String, Object>> mysqlRowPrimaryMap = new HashMap<String, HashMap<String, Object>>();
    //  Map<String, Object> oraRowPrimaryMap=new HashMap<String, Object>();
    //  Map<String, Object> mysqlRowPrimaryMap=new HashMap<String, Object>();
        try {
            if (conO != null && conM != null) {
                if (validateTableStatus(inputTableName, conO, conM)) {
                    // Check table existence in Oracle and Mysql Database
    
                    // Create resultset for oracle
                    stmtO = conO.createStatement(
                            ResultSet.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
                    resultSetO = stmtO.executeQuery(DB_QUERY);
                    ResultSetMetaData rsMetaDataO = resultSetO.getMetaData();
    
                    //
    
                    // MySql details for the same table created
                    stmtM = conM.createStatement(
                            ResultSet.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
                    resultSetM = stmtM.executeQuery(DB_QUERY);
    
                    // Get Column Count for two tables
                    ResultSetMetaData rsMetaDataM = resultSetM.getMetaData();
                    logger.debug("Column Count in Oracle table ::"
                            + rsMetaDataO.getColumnCount());
                    logger.debug("Column Count in Mysql table ::"
                            + rsMetaDataM.getColumnCount());
                    // Match Column count of two tables
                    if (rsMetaDataM.getColumnCount() == rsMetaDataO
                            .getColumnCount()) {
                        logger.debug("The Column count in both table are same");
                        oracleRowCount = getRowCount(inputTableName, resultSetO);
                        mysqlRowCount = getRowCount(inputTableName, resultSetM);
                        logger.debug("No of Rows of Oracle Table :: "
                                + oracleRowCount);
                        logger.debug("No of Rows of Mysql Table :: "
                                + mysqlRowCount);
                        if (oracleRowCount != mysqlRowCount) {
                            logger
                                    .debug("The number of rows of Oracle and Mysql tables respectively differs");
    
                        }
    
    
    
                        else {
                            primaryKeyList = getPrimaryKey(inputTableName, conO);
    
                            while (resultSetO.next()) {
    
                                i = 0;
                                primaryKeyListItr = primaryKeyList.iterator();
                                while (primaryKeyListItr.hasNext()) {
    
                                    if (i == 0) {
                                        primaryKeyIni = (resultSetO
                                                .getObject(primaryKeyListItr
                                                        .next().toString()))
                                                .toString().trim();
    
    
                                    } else {
                                        appendStuff = (resultSetO
                                                .getObject(primaryKeyListItr
                                                        .next().toString()))
                                                .toString().trim();
                                        primaryKeyIni = primaryKeyIni + "$"
                                                + appendStuff;
    
                                    }
                                    i++;
    
                                }
    
                                // 
    
                                colCount = rsMetaDataO.getColumnCount();
                                for (j = 1; j <= colCount; j++) {
                                    System.out.println("Col Name"+rsMetaDataO
                                            .getColumnName(j));
                                    System.out.println("Col Value"+ resultSetO
                                            .getObject(rsMetaDataO
                                                    .getColumnName(j)));
                                    oraRowDetailsMap.put(rsMetaDataO
                                            .getColumnName(j), resultSetO
                                            .getObject(rsMetaDataO
                                                    .getColumnName(j)));
                                }
                                  System.out.println("primaryKeyIni"+primaryKeyIni);
                                System.out.println("oraRowDetailsMap inside loop"+oraRowDetailsMap);
                                oraRowPrimaryMap.put(primaryKeyIni,
                                        oraRowDetailsMap);
      }
       System.out.println("oraRowDetailsMap"+oraRowDetailsMap);System.out.println(oraRowPrimaryMap);
    
                }
    
                    } else {
                        logger.debug("The number of Columns of Oracle and Mysql table differs");
                    }
    
                }
            }
        }
    
        catch (SQLException e) {
            logger.debug("Error in CompareOracleMySQLData()" + e.getMessage());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBManager.closeConnection(conO);
            DBManager.closeConnection(conM);
            DBManager.closeStatement(stmtO);
            DBManager.closeStatement(stmtM);
            DBManager.closeResultSet(resultSetO);
            DBManager.closeResultSet(resultSetM);}}
    

2.The output is below ::

                      DEPLOYMENT_LEVEL is: DVL
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection    to      MYSQL  database established
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to      MYSQL  database established
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Oracle table ::4
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Mysql table ::4
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - The Column count in both table are same
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Oracle Table :: 3
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Mysql Table :: 3
Col NameFirst_Name
Col Valuefn
Col NameLast_Name
Col Valueln
Col NameAddress
Col Valueadr
Col NameCity
Col Valuecity
primaryKeyInifn$ln
oraRowDetailsMap inside loop{Address=adr, Last_Name=ln, First_Name=fn, City=city}
Col NameFirst_Name
Col Valuefn1
Col NameLast_Name
Col Valueln1
 Col NameAddress
Col Valueadr1
Col NameCity
Col Valuecity1
primaryKeyInifn1$ln1
 oraRowDetailsMap inside loop{Address=adr1, Last_Name=ln1, First_Name=fn1, City=city1}
Col NameFirst_Name
Col Valuefn3
 Col NameLast_Name
 Col Valueln3
 Col NameAddress
 Col Valueadr3
 Col NameCity
 Col Valuecity3
 primaryKeyInifn3$ln3
  oraRowDetailsMap inside loop{Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}
  oraRowPrimaryMap{fn3$ln3={Address=adr3, Last_Name=ln3, First_Name=fn3,        City=city3},    fn$ln={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn1$ln1=        {Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}}


You are simply reusing the same oraRowDetailsMap for each row. No wonder you have the same map over and over in your result.

Use a Map<...> oraRowDetailsMap = new HashMap<...>(); inside your result set loop to create a new map for each row, instead of only once before the loop.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜