Como JPA (Hibernate) lidar com a transação quando buscar objetos do banco de dados
-
05-07-2019 - |
Pergunta
Atualmente estou desenvolvendo uma aplicação em java usando Hibernate como um gerenciador de persistência e JPA como uma abstração das persistência gerenciar hibernação.
Eu gostaria de saber o impacto de envolver uma consulta resultado em torno de uma transação. Eu sei que o gerenciador de entidade deve permanecer aberto para bug campo preguiçosamente buscado o que sobre a transação em tudo isso?
Aqui está um exemplo de código com a ativação de transações capacidade / desativação.
public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
EntityTransaction tx = null;
try {
if (withTransaction) {
tx = em.getTransaction();
tx.begin();
}
Query query = em.createQuery("from Exportdata");
query.setMaxResults(10);
List<Exportdata> list = query.getResultList();
if (withTransaction)
tx.commit();
return list;
} catch (RuntimeException re) {
if (withTransaction)
if (tx != null && tx.isActive())
tx.rollback();
throw re;
}
}
Qual é a diferença entre ativar ou desativar withTransaction quando esta função é chamado?
Obrigado a todos, Fred
Solução
Não há nenhuma diferença prática aqui, já que não há qualquer mudança de dados. A consulta que você executar irá gerar um SQL selecionar. Transações estão lá para que você possa aplicar propriedades ACID de uma colecção de inserções, atualizações, etc.
No entanto , se você começar a manipular os objetos na lista de voltar de este método, chamando setters, etc. essas mudanças serão propagadas de volta para o banco de dados fora com uma transação em um ad-hoc base. Em outras palavras, você vai efetivamente estar trabalhando com o db em modo auto-commit. Esta é pouco provável que seja o que você quer.
A coisa importante a entender é que a duração de um contexto de persistência e uma transação podem ser gerenciados separadamente. Muitas vezes, porém você gostaria de geri-los juntos.