Olá a todos.
Estou fazendo alguns testes com JPA e tenho uma dificuldade (corrijam-me no que eu disser de errado).
Usando JPA numa aplicação Java SE (ou seja, o gerenciamento é feito pela aplicação e não pelo container), eu esperava que um .persist(obj) fosse efetivado imediatamente no banco, sem requerer commit(). Entretanto, preciso fazer um entityManager.getTransaction.begin() e então um entityManager.getTransaction.commit() para que meu persist tenha seja efetivado.
Não posso fazer entityManager.getTransaction().commit() sem begin() antes porque não haverá transação ativa. O mesmo erro acontece se tentar fazer um mgr.flush().
Segundo a documentação que há em java.sun.com, o modo padrão do "setFlushMode" do manager (AUTO) deveria dispensar a necessidade de iniciar-se uma transação para então confirmá-la mais tarde. Ainda que eu me certifique que o flush mode é AUTO, isso não acontece.
Outra coisa estranha é a seguinte:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpaTestUnit");
EntityManager mgr = factory.createEntityManager();
mgr.setFlushMode(FlushModeType.AUTO);
mgr.persist(new Pessoa("Qualquer nome"));
mgr.getTransaction().begin();
mgr.getTransaction().commit();
Observe que inicio E termino uma transação APÓS o persist, ou seja, fora da transação (acredito eu). E ao executar o commit() o INSERT relacionado à linha do persist é efetivado.
Alguém pode dar uma explicação sobre o que acontece com as transações e o modo de commit automático?
Informações pertinentes: MySQL 4.1 e HSQLDB 1.8.0.7 foram testados, usando TopLink 9.1 b25.