Urgencia com Persistencia @manytoMany

Oi galera, blz?
Eu to com um problema, segue.

Quando vou persistir um dado funciona perfeitamente meu fluxo…

Porem quando vou tentar alterar o fluxo da o seguinte erro:

27/09/2011 10:29:41 com.sun.faces.lifecycle.ProcessValidationsPhase execute
AVISO: failed to lazily initialize a collection, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed

Eu tenho um choice para esta anotacao: Para cada Alteracao eu posso ter N motivos

@JoinTable(name = “ALTERACAO_MOTIVO”, joinColumns = {
@JoinColumn(name = “alteracao”)}, inverseJoinColumns = {
@JoinColumn(name = “motivo”)})
@ManyToMany(cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
@LazyCollection(LazyCollectionOption.TRUE)
@Fetch(FetchMode.SELECT)
private List motivos;

Quando mando salvar, claro, dou um update com JPA, mas estoura essa excecao!
O BREAKPOINT PASSA no getMotivos e lanca a excecao logo em seguida e DETALHE no GET nao pega as alteracoes do CHOICE e mantem o que vem no banco …

Essa excecao nao deveria vim, uma vez que, por essas anotacoes acima eu consigo ver os motivos, tanto que ja vem marcados para mim quais foram selecionados na persistencia!

Codigo que chama o GRAVAR:
<p:commandButton
ajax=“true"
action=”#{psAlteracaoServico.gravar}“
image=“save"
process=”@all"
update=”@form"
onclick="if(!window.confirm(‘Confirma o lançamento das informações ?’)){return false}"
value=“Gravar”
/>

XHTML:

<h:selectManyCheckbox converter=“entityConverter"
layout=“pageDirection"
label=“Motivo(s) para a viabilidade da solicitação"
required=“true"
value=”#{psAlteracaoServico.alteracao.motivos}”>
<f:selectItems value=”#{psAlteracaoServico.motivos}” />
</h:selectManyCheckbox>

cara,

coloca o log do erro completo, fica mais facil para te ajudar.

t+

[quote=thiago fernando]Oi galera, blz?
Eu to com um problema, segue.

Quando vou persistir um dado funciona perfeitamente meu fluxo…

Porem quando vou tentar alterar o fluxo da o seguinte erro:

27/09/2011 10:29:41 com.sun.faces.lifecycle.ProcessValidationsPhase execute
AVISO: failed to lazily initialize a collection, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed

Eu tenho um choice para esta anotacao: Para cada Alteracao eu posso ter N motivos

@JoinTable(name = “ALTERACAO_MOTIVO”, joinColumns = {
@JoinColumn(name = “alteracao”)}, inverseJoinColumns = {
@JoinColumn(name = “motivo”)})
@ManyToMany(cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
@LazyCollection(LazyCollectionOption.TRUE)
@Fetch(FetchMode.SELECT)
private List motivos;

Quando mando salvar, claro, dou um update com JPA, mas estoura essa excecao!
O BREAKPOINT PASSA no getMotivos e lanca a excecao logo em seguida e DETALHE no GET nao pega as alteracoes do CHOICE e mantem o que vem no banco …

Essa excecao nao deveria vim, uma vez que, por essas anotacoes acima eu consigo ver os motivos, tanto que ja vem marcados para mim quais foram selecionados na persistencia!

Codigo que chama o GRAVAR:
<p:commandButton
ajax=“true"
action=”#{psAlteracaoServico.gravar}“
image=“save"
process=”@all"
update=”@form"
onclick="if(!window.confirm(‘Confirma o lançamento das informações ?’)){return false}"
value=“Gravar”
/>

XHTML:

<h:selectManyCheckbox converter=“entityConverter"
layout=“pageDirection"
label=“Motivo(s) para a viabilidade da solicitação"
required=“true"
value=”#{psAlteracaoServico.alteracao.motivos}”>
<f:selectItems value=”#{psAlteracaoServico.motivos}” />
</h:selectManyCheckbox>

[/quote]
cara veja essa mensagem de erro: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed

da uma pesquisada por guj + LazyInitializationException (acho que só semana passada devo ter respondido uns 2 ou 3 tópicos referentes a isso).

ESSE É O LOG:
A LISTA ESTA INICIALIZADA!

O BREAKPOINT passa no getter do ‘Motivos’, mas a lista esta inicializada!!! ASSIM que sai do getter ele estoura a excecaoo!!!

27/09/2011 14:24:07 com.sun.faces.lifecycle.ProcessValidationsPhase execute
AVISO: failed to lazily initialize a collection, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:208)
at org.hibernate.collection.PersistentBag.add(PersistentBag.java:297)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:382)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:129)
at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:315)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1028)
at javax.faces.component.UIInput.validate(UIInput.java:958)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1209)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at org.primefaces.component.accordionpanel.AccordionPanel.processValidators(AccordionPanel.java:261)
at javax.faces.component.UIForm.processValidators(UIForm.java:244)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1165)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:257)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1764)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
javax.faces.FacesException: failed to lazily initialize a collection, no session or session was closed
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:84)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:257)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1764)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:208)
at org.hibernate.collection.PersistentBag.add(PersistentBag.java:297)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:382)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:129)
at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:315)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1028)
at javax.faces.component.UIInput.validate(UIInput.java:958)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1209)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at org.primefaces.component.accordionpanel.AccordionPanel.processValidators(AccordionPanel.java:261)
at javax.faces.component.UIForm.processValidators(UIForm.java:244)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1085)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1165)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
… 22 more

cara, veja isso:

http://www.guj.com.br/posts/listByUser/28699.java

na minha lista de mensagens ja na primeira página tem 3 tópicos onde falei sobre problemas relativos a essa exceção (contando o seu) no momento antes de eu escrever essa mensagem, só na primeira página. No segundo tópico em questão falo como você faz para parar de dar exceção (da uma boa lida, além de explicar o por que dela acontecer eu digo como evitar que de naquele lugar que está dando).

outra coisa, não leva a mal mas se deu essa exceção é por que a o outro lado da relação entre as tabelas não encontra-se preenchido da forma correta.

Umas das poucas coisa que garanto é que mapeado errado nao esta.

Cara dei uma olhada no seu post…
Nao sei se é bem isto, so me confirma para ver se estou errado ou certo???

Quando vou inserir um caboclo, ele funciona beleza…

Quando vou recuperar esse cara eu uso redirecionamento, de uma tela de pesquisa para edicao dos caboclos…

O que eu entendi foi o seguinte, quando eu recupero todo mundo eu abro uma conexao com o entitymanager e recupero…
Quando faco alteracoes e mando submeter o form, o entitymanager nao existe e ele pega como lazyException… ele passa pelo atributo que esta como lazy e estoura!

é isto msm???
O escopo que estou usando é @ViewScoped

e como seria dar merge?? nao entendi a proposta…

[quote=thiago fernando]Umas das poucas coisa que garanto é que mapeado errado nao esta.

Cara dei uma olhada no seu post…
Nao sei se é bem isto, so me confirma para ver se estou errado ou certo???

Quando vou inserir um caboclo, ele funciona beleza…

Quando vou recuperar esse cara eu uso redirecionamento, de uma tela de pesquisa para edicao dos caboclos…

O que eu entendi foi o seguinte, quando eu recupero todo mundo eu abro uma conexao com o entitymanager e recupero…
Quando faco alteracoes e mando submeter o form, o entitymanager nao existe e ele pega como lazyException… ele passa pelo atributo que esta como lazy e estoura!

é isto msm???
O escopo que estou usando é @ViewScoped

e como seria dar merge?? nao entendi a proposta…

[/quote]

você tem uma entidade alteração certo? e ela tem muitos motivos?

a sua entidade alteração não está sendo gerenciada pelo entity manager, então, antes de fazer seuObjetoAlteracao.getMotivos, você precisa ter aberto um novo entity manager, chamar um merge do seu entity manager passando o objeto alteração, então um novo objeto alteração copiado do seu será criado e esta cópia será gerenciada, é com essa cópia que você irá trabalhar, nela você poderá chamar o getMotivos. Veja abaixo um exemplo:

/corrija erros de sintaxe, estou fazendo direto no browser
EntityManager em = SeuUtil.getEntityManager();
Alteracao outroObjeto = null;
outroObjeto = (Alteracao) em.merge(seuObjetoAlteracao);//isso seria dar o merge
List<Motivo> motivos = outroObjeto.getMotivos();

uma coisa que eu esqueci de falar, o merge usado na especificação JPA quando ovocê o usa para ter um objeto gerenciado, ele não torna o objeto que você passou gerenciado, ao invés disso ele cria uma cópia identica do seu objeto que seja gerenciada, mesmo depois da alteração, se você chamar o getMotivos no objeto “seuobjetoAlteracao” (que você tenha previamente), ainda vai dar LazyInitialization, no novo não.

A, desculpa se eu fui meio xato ontem, mal ai.

Sem problema cara…
Todo programador tem miolo solto … rs

Mas voce nao respondeu se estava certo sobre o que eu disse anteriormente.

Eu li numa especificacao, nem sei se esta correto, e de acordo com o que voce disse.

Quando eu recupero e dou redirect na pagina o entitymanager que uso para recuperar os dados ele fica como ‘Apenas leitura’ ??

Se eu quiser alterar entao este objeto, tenho que dar um merge na entidade recuperada (No caso, seria uma copia) e aí sim, seria um entitymanager para ‘Escrita’ ???

[quote=thiago fernando]Umas das poucas coisa que garanto é que mapeado errado nao esta.

Cara dei uma olhada no seu post…
Nao sei se é bem isto, so me confirma para ver se estou errado ou certo???

Quando vou inserir um caboclo, ele funciona beleza…

Quando vou recuperar esse cara eu uso redirecionamento, de uma tela de pesquisa para edicao dos caboclos…

O que eu entendi foi o seguinte, quando eu recupero todo mundo eu abro uma conexao com o entitymanager e recupero…
Quando faco alteracoes e mando submeter o form, o entitymanager nao existe e ele pega como lazyException… ele passa pelo atributo que esta como lazy e estoura!

é isto msm???
O escopo que estou usando é @ViewScoped

e como seria dar merge?? nao entendi a proposta…

[/quote]

bom… respondendo então eu não tenho certeza nenhuma se eu intendi direito como está a sua funcionalidade ai, mas se eu intendi direito é isso mesmo.

eu intendi que você tem de alguma forma onde clicar em uma “alteração” (como uma tabela de “alterações”), clicando nela você vai em outra tela de alteração dos dados da “alteração” (sando aspas quando me referir a entidade), você vai para a outra página redirecionando (você está usando jsf 2? não lembro direito como funciona o escopo view agora mas se mudou de pagina acho que foge do escopo, sei la), as supondo que no managed bean (rpo caso de você estar usando jsf) você tem o objeto da “alteração” clicada, mas não está gerenciado pelo entity manager, você precisa dar um merge neste objeto recuperado da forma que eu mencionei no post anterior… senao vai estourar como você disse.

[quote=thiago fernando]Sem problema cara…
Todo programador tem miolo solto … rs

Mas voce nao respondeu se estava certo sobre o que eu disse anteriormente.

Eu li numa especificacao, nem sei se esta correto, e de acordo com o que voce disse.

Quando eu recupero e dou redirect na pagina o entitymanager que uso para recuperar os dados ele fica como ‘Apenas leitura’ ??

Se eu quiser alterar entao este objeto, tenho que dar um merge na entidade recuperada (No caso, seria uma copia) e aí sim, seria um entitymanager para ‘Escrita’ ???[/quote]

não é que fica “somente leitura”, os relacionamentos que estão lazy, não estão preenchidos e a fonte para lelos não existe mais (o entity manager que estava gerenciando este objeto), dai o erro, se você tentar “ler” estes dados vai dar erro também.

Pense da seguinte forma. objetos não gerenciados pelo hibernate não podem ser excluidos ou alterados e objetos relacionados com o que você está trabalhando, caso estejam com o fetch lazy não poderão ser usados (lidos se preferir) caso o objeto não esteja sendo mais gerenciado por algum entity manager (se você ja tiver fechado o em).