2015-03-30 75 views
0

我在試圖在預生產環境中保留現有庫存時遇到問題。 我想要做的是實際上循環一個文本文件,並從該文件中插入子串到數據庫中。Java Hibernate添加查詢

這裏是我執行的類:

公共類RepriseStock { 私有靜態會話的會話;

public RepriseStock() { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      session.beginTransaction(); 
    } 

    public static int insererPartenaires(String sCurrentLine, int i) { 
      String sql = "INSERT INTO PARTENAIRE(ID," 
          + "MVTSOC," 
          + " MVTAGR, " 
          + "MVTNOMSOC," 
          + "MVTCPTTMAG," 
          + "DATEAGREMENT," 
          + "MVTCHAINE," 
          + "MVTRGPT," 
          + "MVTUNION," 
          + "MVTNOMMAG," 
          + "MVTTELSOC," 
          + "MVTADRMAG," 
          + "MVTVILMAG," 
          + "MVTMAIL," 
          + "MVTSITU)" 
          + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 

      Query query = session.createSQLQuery(sql); 

      query.setInteger(0, i); 

      query.setInteger(1, Integer.parseInt(sCurrentLine.substring(0, 3))); 
      query.setInteger(2, Integer.parseInt(sCurrentLine.substring(3, 10))); 
      query.setString(3, sCurrentLine.substring(10, 34)); 
      query.setInteger(4, Integer.parseInt(sCurrentLine.substring(48, 53))); 

      query.setString(5, sCurrentLine.substring(77, 83)); 

      query.setInteger(6, Integer.parseInt(sCurrentLine.substring(86, 90))); 
      query.setInteger(7, Integer.parseInt(sCurrentLine.substring(90, 94))); 
      // union 
      query.setInteger(8, Integer.parseInt(sCurrentLine.substring(94, 98))); 
      // enseigne 30 
      query.setString(9, sCurrentLine.substring(248, 278)); 
      // tel 
      query.setString(10, sCurrentLine.substring(278, 293)); 
      // adresse 
      query.setString(11, sCurrentLine.substring(293, 323)); 
      // ville 
      query.setString(12, sCurrentLine.substring(323, 348)); 
      // mail 

      query.setString(13, sCurrentLine.substring(398, 448)); 
      // situ 
      query.setString(14, sCurrentLine.substring(449, 452)); 

      return query.executeUpdate(); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
      // TODO Module de remplacement de méthode auto-généré 

      BufferedReader br = null; 
      RepriseStock rs = new RepriseStock(); 

      try { 

        String sCurrentLine; 

        br = new BufferedReader( 
            new FileReader( 
                "C:\\Users\\test\\Desktop\\test\\reprise de stock\\nouveauFichierPREPROD.dat")); 
        int i = 0; 
        sCurrentLine = br.readLine(); 
        while ((sCurrentLine = br.readLine()) != null) { 
          i++; 

          RepriseStock.insererPartenaires(sCurrentLine, i); 

          System.out.println("Nombre de fois : " + i); 

        } 

        System.out.println("total (" + i + ")"); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } finally { 
        try { 
          if (br != null) 
            br.close(); 
        } catch (IOException ex) { 
          ex.printStackTrace(); 
        } 
      } 

    } 

}

執行該腳本後,我總循環是1022次。但是這個數據沒有被保存到oracle表(Partenaire)

我的日誌不顯示任何錯誤。

您是否看到這個問題?

回答

2

它看起來像你沒有提交交易。

如果您希望每次更新都是單獨的事務,請嘗試將session.beginTransaction();移動到insererPartenaires方法的開頭,並將該語句返回的對象捕獲到變量中。然後,在每次更新後,請確保在Transaction對象上調用commit()

如果您希望所有更新都是相同的事務,請將beginTransaction()commit()方法移動到main方法中的while循環的周圍。


另外,請注意,您在這裏不必要地混合了靜態和非靜態。嘗試將public static int insererPartenaires(String sCurrentLine, int i)更改爲public int insererPartenaires(String sCurrentLine, int i)。然後,只需使用實例化的RepriseStock對象來調用該方法,而不是靜態調用它。

您還需要將private static Session session更改爲private Session session