2013-04-12 30 views
1

嗨即时尝试跟踪我的Apache POI读取Excel文件导入到数据库。我坚持导入进度(%进度,时间等)到数据库中的一个单独的表,所以我可以查询数据导入进度。读取Apache POI文件并坚持通过JPA,但坚持实体不会发生,直到方法结束

我的问题是,实体管理器只保留一次“进度”状态,这是在将数据加载到数据库的方法的末尾。

爪哇

@Inject 
     private EntityManager em; 

    public void importTheData(String path){ 

     try 
     { 

      FileInputStream file = new FileInputStream(path); 
      wb = WorkbookFactory.create(file); 
     } catch (Exception ex) {} 

     Sheet sheet = wb.getSheetAt(0); 

     for (int i = 1; i <= sheet.getLastRowNum(); i++) { 

      try { 
       row = sheet.getRow(i); 

       Table theTable = new Table(); 
       theTable.setDate(row.getCell(0).getDateCellValue()); 
    theTable.setDate1(row.getCell(1).getDateCellValue()); 
    theTable.setDate2(row.getCell(2).getDateCellValue()); 

    bdt.add(theTable); 

} 

public void importtheTable() { 

    for(int i=0; i<bdt.size();i++) 
    { 

     em.persist(bdt.get(i)); 

     if(i%2000 == 0){ 
      em.flush(); 
      em.clear(); 
     } 
    } 

    } 

方法setProgress(路径,(100 * I/theTable.getLastRowNum()))尝试的进展状态持续到一个单独的表,但是这仅发生一次(在结束)

任何人都可以帮我吗?

感谢

+2

excel文件中有多少条记录? –

+0

30000条记录在Excel表 – user1694873

回答

3

这取决于交易的范围,你用的注解来定义呢?如果是的话,这解释了为什么一切都在最后完成。

如果您需要,您将需要在此方法中开始/结束交易。

+0

中有importTheData()方法注入我的EntityManager的bean类,它继而保留到数据库中 - 我没有任何@Transaction任何地方.. – user1694873

+0

好吧 - 找到解决方案 - 我把@TransactionManagement (TransactionManagementType.BEAN)在这个类的顶部,并注入@Resource UserTransaction utx whist调用utx.begin();在setProgress()方法和utx.commit()之前;之后 - 干杯P.Lalonde – user1694873

1

它取决于您创建的entityManger。

如果你有像entityManager.gettransaction.commit() 这样的循环编写代码,那么你可以在数据库中获得更新。

但是如果你在循环之后做了它,它将一次全部提交。

此外您在方法问题上指定的事务类型。

+0

我想我不能应用该方法“em.getTransaction()。commit();”作为我的资源类型是JTA - 即时通讯将提出一个新的问题,以进一步阐明我认为与我的persistence.xml设置等当我尝试这种方式,我得到这个异常“一个JTA EntityManager不能使用getTransaction()” – user1694873

+0

你能请告诉我你是如何创建entitiManager实例 – JavaSun

+0

刚更新那里 - 我也试过@Resource UserTransaction utx ...然后utx.begin();和utx.commit();但也得到错误 – user1694873