Criação de registros a partir de uma lista no hibernate

Bom pessoal, minha dúvida é a seguinte.

Tenho uma lista com mais de 6.000.000 de registros, ao realizar um for dessa lista para criar os objetos no BD fica muito carregado e começa a dar OutOfMemory.
Eu gostaria de saber se tem uma maneira de criar essa lista pelo hibernete de alguma forma sem ser necessário fazer um for, ele chega a gravar 1.000.000 de registros, mas começa a travar e dai vem os erros de memoria.
Segue o meu código.

public void create(List<TributoCliProd> listTributo) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            for (int i = 0; i < listTributo.size(); i++) {
                em.getTransaction().begin();
                em.persist(listTributo.get(i));
                em.getTransaction().commit();
            }
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

Ou assim

    public void create(List<TributoCliProd> listTributo) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            for (int i = 0; i < listTributo.size(); i++) {
                em.persist(listTributo.get(i));
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

Ou até mesmo na base do antigo

    public void criaSql(List<TributoCliProd> listTributo) {
        if (ConexaoAuxiliar.conecta()) {
            for (int i = 0; i < listTributo.size(); i++) {
                try {
                    ConexaoAuxiliar.getStm().executeUpdate("INSERT INTO TRIBUTOCLIPROD"
                            + "(CODIGO_FINALIDADE, CODIGO_PESSOA, "
                            + "CODIGO_PRODSERV) VALUES(" + listTributo.get(i).getFinalidade().getCodigo_finalidade() + ","
                            + listTributo.get(i).getPessoa().getCodigo_pessoa() + ", "
                            + listTributo.get(i).getProdServ().getCodigo_produto() + " )");
                } catch (SQLException ex) {
                    Logger.getLogger(TributoCliProdJpaController.class.getName()).log(Level.SEVERE, null, ex);
                    ConexaoAuxiliar.fechaConexao();
                }
            }
            ConexaoAuxiliar.fechaConexao();
        } else {
            System.out.println("Erro ao cenectar.");
        }
    }

todos esses métodos me retornam o mesmo erro devido a grande quantia de registros.

Se não me engnao, seu erro ja começa ao trabalhar 6.000.000 … Se só por usar uma lista desse tamanho não está dando erro, faça o seguinte.

mande de 1000 em 1000.
for(1000 em 1000)
abraConexaoSalveCommitFechaConexao()

Assim vai numa boa.

[quote=Hebert Coelho]Se não me engnao, seu erro ja começa ao trabalhar 6.000.000 … Se só por usar uma lista desse tamanho não está dando erro, faça o seguinte.

mande de 1000 em 1000.
for(1000 em 1000)
abraConexaoSalveCommitFechaConexao()

Assim vai numa boa.[/quote]

Já fiz isso tbm, de 1000 em 1000 e de 10.000 em 10.000 e mesmo assim continua dando o erro.
Obrigado

A dica é não carregar tantos objetos em memória. Não deixe esse listProduto ficar com mais de 100 ou 1000 registros por vez.

Também tente pensar como você faria a arquitetura desse sistema caso trocasse de List para Iterable