Exceção: A CMR collection may only be used within the transction in which it

5 respostas
bhleitao

Galera, quanto tento pegar uma collection no relacionamento 1:n, acontece a seguinte exceção.

java.lang.IllegalStateException: A CMR collection may only be used within the transction in which it was created

O que isso significa? só pode ser usada dentro da mesma transação? humm.
isso parece ferir o conceito de persistencia.

Abracos
breno leitão

5 Respostas

duardor

Vc tah recuperando a collection em uma transacao (veja se nao tah requiresnew) e depois pega a collection e tenta iterar nela … Se fere o conceito de persistencia, eu nao entendi, mas nao fere a spec EJB, que diz exatamente isso…

bhleitao

Duador,
Entao, por que eu não posso pegar um collection dentro de uma transação? Eu tenho que fazer o commit primeiro?
Pelo que eu percebi, isso acontece porque eu estou fazendo teste com o cactus, que fica em um container servelet e o ejb está em um container ejb. Assim, sendo eles containers diferentes, ele não consegue fazer essa transferencia, Note que em um session bean eu consigo executar um código exatamente igual! Viajei?!?

Valeu
Breno

duardor

Eu nao falei que você não pode pegar um collection dentro de uma transacao… Eu soh falei que você deve ITERAR nela na mesma transacao…

imagine um método getMeuRelacionamento que esteja marcada com requiresnew… Ele retorna uma collection de CMRs… Quando você chama este método, a tarnsação corrente , se existir, é suspensa, uma nova é criada… Sua collection será “criada” na nova transação… Quando o método completa a tarnsação ‘nova’ é terminada, e a transação antiga é retornada… Repare que a collection foi criada na transação que terminou… Quando você, na transação que continuou, itera por essa collection, ele dá o erro mencionado…

Isso aconreceu comigo no JBOSS, e a parte da especificação que diz isso é a 10.4.2.2 Container-managed relationships … To me referindo ao documento da 2.0…

Atenciosamente,

bhleitao

Ahh saquei o problema. Valeu. Mas o problem é que eu não estou iterando a collection. Eu pego e imprimo a mesma, e mesmo assim o erro surge. :frowning:

Mas os tipos de transações possíveis são os seguintes:

NotSupported
Supports
Required
RequiresNew
Mandatory
Never

Sendo que o default é o Supports (xdoclet) . Assim sendo, o problema não deveria acontecer, correto!? Coloquei uma transação do tipo required também e o mesmo erro. humm…

Valeu
Breno

U

Pois é, aconteceu o mesmo comigo. Dei uma lida aqui, mas não entendi mto bem, principalmente como resolver.

Realmente, quando itero minha colexao dentro do Session, tudo funciona sem problemas. A excessao é lançada quando acesso essa colecao no meu Servlet.
Acontece que preciso iterar essa colecao de Proxys pra gerar meus objetos de negócio (os VOs, se entendi bem a difinicao de VO) e encaminhar pra exibicao no JSP…

Segue o codigo…

//Servlet..
private Collection<ViagemVO> pesquisarViagens(CidadeLocal origemLocal, CidadeLocal destinoLocal, Date dataSaidaVoo) {
            Collection<ViagemVO> listaViagens = new ArrayList<ViagemVO>();
            GerenciarViagensLocal gerenciarViagens = this.lookupGerenciarViagensBean();     //Session Bean
            
            Collection<ViagemLocal> viagensLocais =  gerenciarViagens.pesquisarViagens(origemLocal, destinoLocal, dataSaidaVoo);
            for(ViagemLocal  viagemLocal: viagensLocais){
                  ViagemVO viagem = new ViagemVO();
                  viagem.setId(viagemLocal.getId());
                  viagem.setOrigem( this.recuperarCidadeVO(viagemLocal.getOrigem()) );
                  viagem.setDestino( this.recuperarCidadeVO(viagemLocal.getDestino()) );
                  viagem.setVoos( this.recuperarVoosVO(viagemLocal.getVoos()) );
 //Justamente esse metodo, "recuperarVoosVO", que percorre a colecao de VooLocal
// e deveria retornar uma colecao de VoosVO se nao fosse a excessao
                  
                  listaViagens.add(viagem);
            }
            
            return listaViagens;
      }

Isso tudo pra evitar que os Sessions retorne VOs para o cliente web… (É o recomendável, nao?! )

Tem como alguem me ajudar??

:wink:

Criado 24 de fevereiro de 2005
Ultima resposta 20 de jan. de 2007
Respostas 5
Participantes 3