Loop de persistência com Hibernate

Bom Dia pessoal, estou tendo problemas para persistir uma grande quantidade de registros no banco.
Eu carrego um arquivo csv com mais de 50 mil registros, cada linha representa um objeto meu, preciso ler linha a linha e persistir no banco. até a i tudo bem. Mas qnd coloco isso em um loop para ler a linha popular um objeto e persistir no banco o hibernate me lança a seguinte exception : Transaction not successfully started .

Alguem teria alguma dica me que eu possa fazer isso ou o porque deste erro?

Vlw pela força…

Posta o código pra gente dar uma olhada… Mas isso aí ta com cara que vc tá usando o método da classe Session “getTransaction()” ao invés do “beginTransaction()” para iniciar a transação. No caso, você deve estar pegando uma “transação não iniciada”;

O metodo que percorro o arquivo e persisto o objeto é este:
[code] public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res)
{ long pri = System.currentTimeMillis();
try
{
//int i = 0 ;
String linha = null;
ImportacaoFuncionarioceaBusiness business = new ImportacaoFuncionarioceaBusiness();
LinkedList funcionarios = new LinkedList();
FuncionarioHibernateDAO aux = new FuncionarioHibernateDAO ();
FileReader reader = new FileReader(new File(req.getParameter(“file”)));
BufferedReader leitor = new BufferedReader(reader);
leitor.readLine(); // despresa a primeira linha do arquivo desligamento
while ((linha = leitor.readLine()) != null)
aux.makePersistent(business.populaFuncionario(linha.split(";",50)));

}[/code]
                   

                     e o metodo do meu genericDao é este:

@SuppressWarnings("unchecked") public T makePersistent( T entity ) { getSession().saveOrUpdate(entity); getSession().beginTransaction().commit(); return entity; }

Estou usando o “beginTransaction()”.Este seria o modo certo de se fazer ?

Obrigado por ter respondido.

O correto é primeiro iniciar a transação, fazer o que deseja e no fim fazer o commit.

@SuppressWarnings("unchecked")  
public T makePersistent( T entity )  
{  
  getSession().beginTransaction();  //inicia transação
  getSession().saveOrUpdate(entity);  
  getSession().getTransaction().commit();  //pega a transação iniciada e realiza o commit.
    return entity;  
}  

Tenta isso:


private Transaction tx;

@SuppressWarnings("unchecked")  
public T makePersistent( T entity )  
{
  tx =  this.getSession().beginTransaction();
  getSession().saveOrUpdate(entity);  
  tx.commit();
    return entity;  
}  

Algo assim… to longe de um DAO e de uma IDE pra ter certeza hehe

Outra coisa importante, estouro de memória…dá uma lida nisso aqui:

http://docs.jboss.org/hibernate/orm/3.6/reference/pt-BR/html/batch.html

private Transaction transacao;  
private Session sessao;

@SuppressWarnings("unchecked")    
public T makePersistent( T entity )    
{  
  try {
  this.sessao = this.getSession(); // Não está usando HibernateUtil? Poderia ser assim = this.sessao = HibernateUtil.getSessionFactory().openSession();
  this.transacao =  sessao.beginTransaction();
  getSession().saveOrUpdate(entity);
  tx.commit();
  } catch (Exception e) {
     tx.rollback();
     entity = null;
  } finally {
    this.sessao.close();
  }
    return entity;
}

Como está abrindo sessão e transação a todo momento… e você vai ler/inserir muitos registros de uma vez, tente personalizar seu DAO para abrir a sessão e iniciar a transação de fora… e após o processamento, commit ou rollback no caso de erro e fechando a transação.
Lembrando de executar de tempos em tempos o flush() e o clear().

Boa Tarde.

Obrigado pela ajuda de todos, consegui resolver o problema, fiz conforme foi falado :

Criei um metodo personalizado na minha dao para só após todos os saves ele desse o commit().
e realmente o problema estava dando porque conforme o ErickRAR disse, eu estava abrindo a sessão na hora errada.
Agora está tudo rodando, Valeu mesmo pela força pessoal.