Prezados, boa noite.
Alguem poderia me explicar melhor a Diferença entre uma Transação e uma Sessão?
O que vem na minha cabeça de burro é isso aqui ó:
Tipo uma transação é sempre que se faz um CRUD no banco e uma sessão é onde estão os dados que uma transação usa pra isso…
Ta certo? Alguem poderia detalhar, explicar ou me informar onde sanar essa dúvida certinho?
Abraços!!!
Segue como exemplo uma classe simples que cria sessões do Hibernate para melhor entendimento da pergunta.
public class HibernateUtils {
private static SessionFactory factory;
static {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
factory = null;
}
}
public static Session getSession() {
return factory.openSession();
}
}
A transação é como se fosse uma conversa com o banco de dados. A conversa só pode acontecer se a sessão tiver sido iniciada, pois ela (a sessão) contém informações sobre de onde vêm e para onde vão os dados da conversa (= transação). É por isso que se você der um session.close() em métodos DAO, o hibernate não consegue mais manipular os dados da memória pois tais dados(na memória) sempre pertencem a uma sessão aberta.
Uso um HibernateUtil diferente do seu…
[code]package br.com.siarborizacaourbana.hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil {
private static SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
return new AnnotationConfiguration().configure().buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}[/code]
Exemplo de chamada de sessão nos meus códigos DAO…
[code]import java.util.List;
// import OMITIDOS
import br.com.meuProjeto.hibernate.HibernateUtil;
public class AbstractDAO {
protected Session session;
public void salvarOuAlterar(Object object) throws Exception {
Transaction transaction = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.beginTransaction();
session.saveOrUpdate(object);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
throw new Exception("Erro ao Gravar");
} finally {
// session.close();
}
}
}[/code]
Apesar de concordar com oliversistemas gostaria de adicionar algo mais no descrito, mesmo correndo o risco de estar errado.
Quando vc ou algo se conecta ao banco ocorre o seguinte (entre varias outras coisas):
- É disponibilizado uma conexão.
- Automaticamente é criada uma sessão.
- Cada comando submetido / grupo de comandos irá configurar uma transação que terá seu fim após um commit. Detalhe, se a configuração do banco for do tipo autocommit após cada comando submetido ocorrera um commit automaticamente finalizando uma transação onde ocorreu o processamento de APENAS um comando (select, update, delete etc…). Caso contrario (sem commit automático) o fim da transação será controlada pelo usuário, ou seja, o usuário submete no mínimo um e no máximo n comandos e finaliza a transação com commit no momento que achar conviniente.
- O comando rollback tambem finaliza a transação só que de forma inversa, ela DESFAZ todos os resultados dos comando submetidos pelo usuário.
flws