[Resolvido]LazyInitializationException VRaptor3 + br.com.caelum.vraptor.util.hibernate

Olá pessoal estou com o velho problema do lazy initialization exception…ja rodei a net e não consegui achar a solução adequada para a forma que está configurada o meu projeto.

Ele esta assim:
Quem me prove as sessions é o vraptor atraves dessa linha no web.xml

<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.util.hibernate</param-value> </context-param>
dai dando uma fucada no manual do vraptor e implementei o interceptor que é listado lá no final da pagina para o padrao open session in view
http://vraptor.caelum.com.br/documentation/interceptors/

mudei a classe Database para Session e espero que o vraptor a injete no construtor…

@RequestScoped
@Intercepts
public class SessionInterceptor implements Interceptor {

    private final Session controller;
    private final Result result;
    private final HttpServletRequest request;

    public SessionInterceptor(Session controller, Result result, HttpServletRequest request) {
        this.controller = controller;
        this.result = result;
        this.request = request;
    }

    public void intercept(InterceptorStack stack, ResourceMethod method, 
                            Object instance) throws InterceptionException {
        result.include("contextPath", request.getContextPath());
        try {
            controller.beginTransaction();
            stack.next(method, instance);
            controller.getTransaction().commit();
        } finally {
            if (controller.getTransaction().isActive()) {
                controller.getTransaction().rollback();
            }
            controller.close();
        }
    }

    public boolean accepts(ResourceMethod method) {
        return true;
    }

}

tive que fazer algumas adptacoes, so que quando eu rodo a aplicacao:

Servlet.service() for servlet default threw exception org.hibernate.TransactionException: Transaction not successfully started at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131) at projeto.intercepts.SessionInterceptor.intercept(SessionInterceptor.java:35) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source)

galera dá um help ai…ja faz 2 dias que estou tentando conseguir isso e nao ta saindo =/ …
obrigado

Pelo que eu vi no stackTrace ta dando erro na linha 35 da sua Classe SessionInterceptor.
"[color=red]at projeto.intercepts.SessionInterceptor.intercept(SessionInterceptor.java:35)[/color]"
E aqui no site a sua classe termina na linha 34. Tenta dá um clean no project pra gerar os .class novamente e ver se continua dando o erro.
Precisamos saber exatamente a linha que ta dando erro.

ola antonio, dei um clean aqui no projeto e verifiquei aqui agora o erro esta em :
at wiz.me.intercepts.SessionInterceptor.intercept(SessionInterceptor.java:21)

que no meu caso eh a linha

dei clean/delete/start varias vezes e aparce isso mesmo, erro na hora dar commit

obrigado

joeroots, vc não precisa da classe SessionInterceptor, o pacote util.hibernate já registra um interceptor que faz exatamente o que o seu SessionInterceptor.

pode apagá-lo, ou simplesmente tirar o @Intercepts

entao Lucas, eu so implementei ele pq eu estou recendo a LazyInitializationException do Hibernate…
O meu session já esta vindo do VRaptor.
Porem o Hibernate diz que a session foi fechada na renderizção da minha view.


Mudei aqui no meu controller, antes de chamar a coleção e dou um refresh no meu obj…entao consegui manipular a lista normalmente…
não sei se a melhor form de se fazer isso, mas por enquanto está funcionando…
Esta é a melhor maneira mesmo?/
dar um refresh na entidade antes de chamar a coleção?

a sua entidade precisa estar managed pelo hibernate para vc poder acessar a coleção sim, dentro de uma session aberta.

a lazy init que estava acontecendo era em um redirect?

de qqer forma é bom sempre dar um load ou um refresh na entidade antes de fazer as operações e acessos

como assim “managed” pelo hibernate não entendi??
o lazy dava quando eu enviava um get a partir do jsp para a logica que mexia com a coleção

um objeto fica managed qdo vc puxa ele do banco na sessão (ou faz qqer operação nele). Se eu não me engano tem um artigo aqui no guj sobre isso…

esse get do jsp que vc tá falando é o que? jsp:forward? c:import?

E algo assim:

<a href="/produtos/add/12" >Adicionar um produto a lista</a>

um link normal que envia um get para o controller.
O Controller entao adicionar a uma lista o produto 12…
e a lazy estava dando quando eu tentava algo assim:

[code]
@Entity
public class User…
@OneToMany(fetch = FetchType.LAZY…)
private Collection produtos;

...
@Path("/produtos/add/{id}")
public void add(Long id){
   Produto prod = dao.findById(id)
   userOnline.getUser().getProdutos().add(prod)
}
...

o lazy é por causa desta chamada:

userOnline.getUser().getProdutos()

vc colocou um user no UserOnline sem ter puxado o getProdutos() em uma requisição, e daí usou o getProdutos() em outra, por isso a lazy init.

Produto tem um setUser? se sim, basta vc fazer:

prod.setUser(userOnline.getUser());

tem sim, vou adicionar esse modelo de acesso
Obrigado;