2015-03-30 38 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