[RESOLVIDO]Open Session In View com Vraptor 3

Boa tarde Pessoal.

Eu pesquisei a respeito disso, mas não consegui esclarecer minha dúvida. O vraptor oferece suporte nativo ao padrão Open Session In View ou eu preciso implementar na mão mesmo? Caso não ofereça, alguém pode me disponibilizar um link com exemplo de como fazer isso usando vraptor? Tenho q resolver isso o quanto antes, pois em varios dos meu relacionamentos @OneToMany to precisando colocar EAGER pra evitar os lazyinitializationexception. Eu consultei a documentação do framework mas não vi nada referente a configuração dessa funcionalidade. Grato pela ajuda.

Pelo que eu saiba o vraptor não implementa.

http://blog.caelum.com.br/enfrentando-a-lazyinitializationexception-no-hibernate/

No seu web.xml

	<filter>
		<filter-name>hibernateSessionFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>

Abraços

se vc usa o componente do hibernate ou jpa ele suporta isso sim: http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

configure só pelo context-param packages, não pelo provider

meu web.xml está assim

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <context-param> <param-name>br.com.caelum.vraptor.provider</param-name> <param-value>br.com.caelum.vraptor.util.jpa.JPACustomProvider</param-value> </context-param> </web-app>

O que devo mudar nele?

troque o context param que vc pôs por:

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>br.com.caelum.vraptor.util.jpa</param-value>
</context-param>

isso já é open session in view

Muito Obrigado.

Ola estou usando o vraptor com o seguinte config

<context-param>
	<param-name>br.com.caelum.vraptor.packages</param-name>
	<param-value>        
        br.com.caelum.vraptor.util.hibernate
        </param-value>
</context-param>

Continuo tomando LazyInitializationException e sendo obrigado a colocar EAGER nos OneToMany

segue exemplo…

[code]@Entity
public class User implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private String password;

@OneToMany(cascade = CascadeType.ALL, mappedBy="user")	
private Collection<RequestOrder> requestOrder;

[/code]

quando do user.getRequestOrder() no jsp tomo LazyInitializationException so para se eu colocar o fecth como EAGER, o opensession view deveria tratar isso sem eu ter que colocar o eager.

podem ajudar?

vc tá recebendo a session no construtor dos seus daos? ou tá criando na mão?

Codigo simplificado para ficar melhor… tirei a camada de bussiness, mais se eu não colocar o fech type como eager eu tomo lazyini e tal.

[code]@Resource
public class IndexController {

private final Result result;
private final UserDao userDao;
    private final UserSession userSession;


public IndexController(Result result,UserDao userDao,UserSession userSession) {
	this.result = result;
	this.userDao=userDao;			
        this.userSession = userSession;	    
}

@Path("/index")
public void index() {
	result.include("orderList", userDao.findById(userSession.getUser().getId()).getRequestOrder());
    }[/code]

vc não respondeu minha pergunta… no seu userDao vc está recebendo a session do hibernate no construtor?

Ta recebendo pelo vraptor

@Component
public class UserDao extends GenericDAO<User>{

	public UserDao(Session session) {
		super(session);
	}
	
package br.com.persistence;


import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;

@Component
public abstract class GenericDAO<T extends Serializable> {

  
    protected final Session session;
    private final Class<T> persistentClass;

       
    @SuppressWarnings("unchecked")
	public GenericDAO(Session session) {      
        this.session = session;
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public Session getSession() {
        return session;
    }


    public Long save(T entity) {
    	Long saveNumber=-1L;
    	saveNumber = (Long) getSession().save(entity);
    	return saveNumber;
    }

    public void update(T entity) {
    	getSession().update(entity);
    }

    public void delete(T entity) {
    	getSession().delete(entity);
    }

    @SuppressWarnings("unchecked")
	public List<T> findAll(){
        return getSession().createCriteria(persistentClass).list();
    }

    @SuppressWarnings("unchecked")
	public T findByName(String name) {
        return (T) getSession().createCriteria(persistentClass).add(Restrictions.eq("nome", name).ignoreCase()).uniqueResult();
    }

    @SuppressWarnings("unchecked")
	public T findById(Integer id) {
        return (T) getSession().createCriteria(persistentClass).add(Restrictions.eq("id", id)).uniqueResult();
    }
    
    @SuppressWarnings("unchecked")
  	public T findById(Long id) {
          return (T) getSession().createCriteria(persistentClass).add(Restrictions.eq("id", id)).uniqueResult();
      }

}

acho que sei qual é o problema:

vc carregou um user numa requisição e colocou dentro do userSession, que é session scoped…

qdo vc usa esse usuário em outra requisição, a session que carregou ele já está fechada, por isso o erro…

jeito de resolver isso: carregar todos os dados do usuário que vc for usar dentro do userSession na primeira requisição, ou dar um refresh no usuário do userSession a toda requisição

vou testar vlw