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

12 respostas
E

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.

12 Respostas

E

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

D

da uma olhada nesse post

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

E

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:
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;
	}

}
D

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

E

é 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?

D

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)
	    
	  }

	

}
E

Deu o mesmo erro, hehe

D

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

E

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.

D

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

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)
	    
	  }

	

}
Não li a apostila, mas pelo o que conheço ela deve chegar a um ponto que os DAOS serão assim:
public ProdutoDao(Sesssion session) {
	    this.session = session;
	  }
Ai seus problemas seriam resolvidos.
E
Daniel.F:
Este código era para funcionar.Não entendi o que deu errado.
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)
	    
	  }

	

}

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

D

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.

Criado 20 de fevereiro de 2013
Ultima resposta 20 de fev. de 2013
Respostas 12
Participantes 3