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.
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
uchoaaa
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..privateCollection<ViagemVO>pesquisarViagens(CidadeLocalorigemLocal,CidadeLocaldestinoLocal,DatedataSaidaVoo){Collection<ViagemVO>listaViagens=newArrayList<ViagemVO>();GerenciarViagensLocalgerenciarViagens=this.lookupGerenciarViagensBean();//Session BeanCollection<ViagemLocal>viagensLocais=gerenciarViagens.pesquisarViagens(origemLocal,destinoLocal,dataSaidaVoo);for(ViagemLocalviagemLocal:viagensLocais){ViagemVOviagem=newViagemVO();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 excessaolistaViagens.add(viagem);}returnlistaViagens;}
Isso tudo pra evitar que os Sessions retorne VOs para o cliente web… (É o recomendável, nao?! )