[RESOLVIDO]Open Session In View com Vraptor 3

12 respostas
PaduaAlves

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.

12 Respostas

lelodois

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

Lucas_Cavalcanti

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

PaduaAlves

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?

Lucas_Cavalcanti

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

PaduaAlves

Muito Obrigado.

Diabo_Loiro

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..

@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;

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?

Lucas_Cavalcanti

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

Diabo_Loiro

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.

@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());
        }
Lucas_Cavalcanti

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

Diabo_Loiro

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();
      }

}
Lucas_Cavalcanti

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

Diabo_Loiro

vou testar vlw

Criado 26 de maio de 2011
Ultima resposta 28 de jul. de 2012
Respostas 12
Participantes 4