Hibernate - Transações Aninhadas

4 respostas
V

Oi gente,
Sou iniciante e estou tentando criar uma transacao dentro de outra.
Exemplo:

public static void main(String args[]) {

Session s1 = HibernateUtil.newSession();

s1.getTransaction().begin();     // s1=Transação "PAI"

gravaT2();                       // Chama Transação 2

s1.getTransaction().rollback();  // Não Desfaz a Inclusao feita p/ gravaT2() <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/f.pngrowning.png?v=5" title=":frowning:" class="emoji" alt=":frowning:">

s1.close();

}
public void gravaT2(){

Session s2 = HibernateUtil.newSession();

s2.getTransaction().begin(); // s1=TRANSAÇÃO "FILHA"

dao.adiciona(Cliente);

s2.getTransaction().commit(); // Inclui normalmente <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pnglight_smile.png?v=5" title=":slight_smile:" class="emoji" alt=":slight_smile:">

s2.close();

}

Precisava que o Roolback desfizesse a Inclusão…
tentei usar a mesma sessao p/ as 2 transações, mas vi que cada sessão só da suporte a uma transação por vez
(Talvez não saiba como abrir 2 transações ao mesmo tempo p/ sessão).
Ou o Hibernate não suporta transações aninhadas ???

4 Respostas

M

v001:
Oi gente,
Sou iniciante e estou tentando criar uma transacao dentro de outra.
Exemplo:

public static void main(String args[]) {

Session s1 = HibernateUtil.newSession();

s1.getTransaction().begin();     // s1=Transação "PAI"

gravaT2();                       // Chama Transação 2

s1.getTransaction().rollback();  // Não Desfaz a Inclusao feita p/ gravaT2() <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/f.pngrowning.png?v=5" title=":frowning:" class="emoji" alt=":frowning:">

s1.close();

}
public void gravaT2(){

Session s2 = HibernateUtil.newSession();

s2.getTransaction().begin(); // s1=TRANSAÇÃO "FILHA"

dao.adiciona(Cliente);

s2.getTransaction().commit(); // Inclui normalmente <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pnglight_smile.png?v=5" title=":slight_smile:" class="emoji" alt=":slight_smile:">

s2.close();

}

Precisava que o Roolback desfizesse a Inclusão…
tentei usar a mesma sessao p/ as 2 transações, mas vi que cada sessão só da suporte a uma transação por vez
(Talvez não saiba como abrir 2 transações ao mesmo tempo p/ sessão).
Ou o Hibernate não suporta transações aninhadas ???

Não entendi muito bem o que você deseja fazer com essas “transações aninhadas” …

Mais você não vai conseguir “desfazer” uma inclusão, até porque a inclusão foi feita utilizando uma outra sessão, a sessão1 não “enxerga” a sessão2 acredito eu…

E a inclusão ja foi feita, você não vai conseguir excluir estas infos do banco…

DaniloAndrade

Bom dia!

como o mihawk~ falou, da forma que vc esta fazendo vc nunca vai conseguir da o rollback.

e tem outra coisa seu metodo gravaT2 tem responsabilidade demais alem de gravar que é a função principal dele ele ta abrindo e fechando sessão e iniciando e finalizando transação. isso é uma má pratica

public static void main(String args[]) { 
Session s1 = HibernateUtil.newSession(); 
s1.getTransaction().begin(); // s1=Transação "PAI" 

ClienteDao dao = new ClienteDao(s1);

Cliente cliente = new Cliente();
dao.grava(cliente); 

Cliente outroCliente = new Cliente();
dao.grava(outroCliente); // dentro metodo grava deve ser usado apenas o session.persist(); não deve se abrir sessão nem transação

// mais codigo transacional aqui...

s1.getTransaction().rollback(); //para que o rollback funcione tudo deve estar na mesma transação e na mesma sessão
s1.close(); 
}
Hebert_Coelho

Não faça isso. Não existe a necessidade de aninhar transações. [=

Faça o seguinte,

Crie, faça o que tiver que fazer, finalize.

Crie outra, faça o que tiver que fazer, finalize.

V

Oi gente,
Antes de tudo obrigado pela ajuda.

Pelo que entendi, numa mesma session só pode haver uma transação sendo executada ???
se a resposta for sim então o Hibernate NÃO suporta transações aninhadas ??

Valeu a atenção.

Criado 16 de setembro de 2012
Ultima resposta 17 de set. de 2012
Respostas 4
Participantes 4