将哈希图放入另一个集合的问题

| 在下面的代码中,子哈希表在循环内打印时显示正确的值,但是当父哈希表在循环外打印时,子哈希表将显示仅最后一个条目的值覆盖所有值的映射。
    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,输出如下:
                      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}}
    
已邀请:
        您只是在每行重复使用相同的
oraRowDetailsMap
。难怪您一遍又一遍地拥有相同的地图。 在结果集循环内使用3来为每一行创建一个新映射,而不是在循环前仅创建一次。     

要回复问题请先登录注册