O hibernate tem um bom esquema para fazer inserts em grandes quantidades, em lote, na base de dados, vc consegue configurar para ele fazer inserts mais rapido, fazendo em lote, e em alguns casos vc deve limpar os objetos na sessão(cache 1 nivel) constantemente durante o processamento, pois senão ele fica + lento se vc deixar ele gerenciar o cache de primeiro nivel
Sobre threads tome muito cuidado, e no seu caso não vejo vantagem alguma, muitas vezes os programados erram usando threads pensando que ira resolver mais rapido o problema. não é sempre por ai. No seu caso como só tem uma sessão do hibernate não adiantará muita coisa, pois sempre ira funilar em um método do hibernate, que ira atrasar todas as suas threads.
Eu costumo fazer da seguinte maneira, quando tenho um problema parecido com o seu:
O usuário envia o arquivo, ou aperta o botão e o processo fica rodando no sevidor, em uma thread separada da do request para liberar o request, quando o processo acaba o sistema envia um email para o usuario dizendo q o processamento acabo ou ele acompanha o processamento por uma tela, que fica mostrando quanto do processo já foi.