Illegally attempted to associate a proxy with two open Sessions [resolvido]

Estou no exercício 16 desta página http://www.caelum.com.br/apostila-vraptor-hibernate/refatorando/#6-7-exercicios
Refatorando a classe AlteracaoDeContato mas tá dando o erro colocado no assunto deste post. Alguém pode me ajudar?
Meu código está no GitHub https://github.com/erickdeoliveiraleal/teste/tree/master/testehub
Para facilitar eu deixei o ultimo commit com o código errado e o penúltimo commit o código está funcionando.

PS.:Eu já tentei dar o session.close no método “procura”, mas ao fazer isso, ele encerra todas sessões e o método de alteração não consegue prosseguir.

Pra facilitar, esses são os dois códigos mais necessários pra ver o erro:

https://github.com/erickdeoliveiraleal/teste/blob/master/testehub/src/br/com/caelum/goodbuy/testes/AlteracaoDeProduto.java
https://github.com/erickdeoliveiraleal/teste/blob/master/testehub/src/br/com/caelum/goodbuy/dao/ProdutoDao.java

da uma olhada nesse post

http://www.guj.com.br/java/293736-hibernate-vraptor-alteracaodeproduto-e-remocaodeproduto#1558829

Uhn, do jeito que foi passado no post indicado por você pode até funcionar, mas não é a mesma solução apresentada pela apostila

exemplo: [code]package br.com.caelum.goodbuy.testes;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;

public class AdicaoDeProduto {

  public static void main(String[] args) {

    Produto produto = criaProduto();

    new ProdutoDao().salva(produto);
  }

private static Produto criaProduto() {
	Produto produto = new Produto();
    produto.setNome("Teclado");
    produto.setDescricao("Teclado ABNT2");
    produto.setPreco(35.90);
	return produto;
}

}[/code]

mas vc entendeu porque o erro acontece?

nesse salvar não vai ter problema, mas se vc fizer o alterar vai dar problema porque vc vai buscar o objeto criando uma session , depois vc vai instanciar o ProdutoDao() que instancia outra session no construtor, e depois vai chamar o alterar que vai lançar a exception, isso por que vc buscou o objeto em uma session e ta tentando salvar ele em outra

uma solução é aquela que esta no post que vai acabar sendo o seu resultado no final depois dos exercícios
a outra e apos vc buscar o produto na primeira session fechar a session

1 curtida

é pq eu gostaria de usar a solução da apostila…
e quando eu tento fechar a conexão depois de buscar ele diz que a conexão foi fechada e não consegue alterar, é mole?

tenta assim

package br.com.caelum.goodbuy.testes;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;

public class AlteracaoDeProduto {

	  public static void main(String[] args) {
             ProdutoDao dao = new ProdutoDao();
             Produto produto = dao.procura(1L);
             produto.setNome("Modificado");
	    produto.setDescricao("Modificado2");
	    produto.setPreco(1.99);
	    
              dao.altera(produto)
	    
	  }

	

}

Deu o mesmo erro, hehe

como vc esta fechando coloca seu dao ai com a alteração fechando o session

Não, desse jeito dá certo e nem preciso fechar a sessão, é que eu queria fazer uma solução parecida com a da apostila mesmo… Mas vou deixar assim… E passar pro próximo capítulo.

Este código era para funcionar.Não entendi o que deu errado.

[quote=DaniloAndrade]tenta assim

package br.com.caelum.goodbuy.testes;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;

public class AlteracaoDeProduto {

	  public static void main(String[] args) {
             ProdutoDao dao = new ProdutoDao();
             Produto produto = dao.procura(1L);
             produto.setNome("Modificado");
	    produto.setDescricao("Modificado2");
	    produto.setPreco(1.99);
	    
              dao.altera(produto)
	    
	  }

	

}
[/code][/quote]

Não li a apostila, mas pelo o que conheço ela deve chegar  a um ponto que os DAOS serão assim:
[code]public ProdutoDao(Sesssion session) {
	    this.session = session;
	  }

Ai seus problemas seriam resolvidos.

[quote=Daniel.F]Este código era para funcionar.Não entendi o que deu errado.

[quote=DaniloAndrade]tenta assim

[code]
package br.com.caelum.goodbuy.testes;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.modelo.Produto;

public class AlteracaoDeProduto {

  public static void main(String[] args) {
         ProdutoDao dao = new ProdutoDao();
         Produto produto = dao.procura(1L);
         produto.setNome("Modificado");
    produto.setDescricao("Modificado2");
    produto.setPreco(1.99);
    
          dao.altera(produto)
    
  }

}
[/code][/quote][/quote]

Deu certo sim, mas não é muito parecido com o modelo da apostila, na parte de inserir uma nova linha no banco.

E o código que eu coloquei acima? há erratas na apostila da Caelum e já encontrei algumas na apostila de Ruby.
O único jeito deste lógica funcionar é tirar o objeto de uma das sessões ou então usar uma sessão só passando-a par aos construtores
do objeto.