Problema com OpenSessionInView

2 respostas
DirceuSobrinho

Olá…

Estou usando OpenSessionInView e ele está resolvendo quase todos os problemas com Lazy Initialization Exception.

Exceto em um caso, quando pagino o resultado de uma busca.

Situação:

Quando efetuo a busca obtenho resultado ok com todas coleções que estão definidas como lazy obtidas atraves OSIV

quando uso a paginacao do richfaces (rich:datascroller), tento acessar a segunda pagina do resultado da busca a Lazy Initialization Exception é disparada, pois a sessão ja está fechada, sendo assim OSIV nao consegue obter as coleções lazy

Alguem faz ideia de como posso resolver este problema?

2 Respostas

Felagund

se tiver usando mapeamentos xml adiciona no .hbm.xml dos seus Beans em cada uma das collection o atributo lazy=“false” vai dar uma carga extra na sua aplicação mas não vai dar erro.

ou ideia é na camada DAO, no metodo por exemplo getWithCollection()

vc faz um JOIN que não tera problemas

String hql = "select o from Objeto o join Objeto2 o2 ON (o.cod2 = o2.cod)";

lembre-se de adicionar o select pois se não for selecionado ele retornará um HashMap.

[]'s

DirceuSobrinho

estou com problemas de performace lazy=false, aumenta meu problema =/

no caso do join, é melhor que o lazy=false, no entanto, nao me agrado mt.

pois tenho varias consultas como essa:

public List<AnuncioVeiculo> retrieveByTipo(String tipo) {
		Criteria criteria = getSession(false).createCriteria(getClasse());
		criteria.add(Restrictions.eq("estado",AnuncioEstado.NO_AR));
		criteria.createCriteria("produto").add(Restrictions.eq("tipo", tipo));
		criteria.setMaxResults(100);
		return criteria.list();
	}

e se eu utilizar join terei que adicionar nesses metodos o FetchMode.JOIN, ficando o metodo assim: [ficando algo parecendo um lazy=false]

public List<AnuncioVeiculo> retrieveByTipo(String tipo) {
		Criteria criteria = getSession(false).createCriteria(getClasse());
		criteria.add(Restrictions.eq("estado",AnuncioEstado.NO_AR));
		criteria.createCriteria("produto").add(Restrictions.eq("tipo", tipo));
		criteria.setMaxResults(100);
		criteria.setFetchMode("produto", FetchMode.JOIN);
		criteria.setFetchMode("produto.modelo", FetchMode.JOIN);
		criteria.setFetchMode("produto.modelo.fabricante", FetchMode.JOIN);
		criteria.setFetchMode("fotos", FetchMode.JOIN);
		criteria.setFetchMode("contato", FetchMode.JOIN);
		criteria.setFetchMode("contato.telefones", FetchMode.JOIN);
		criteria.setFetchMode("anunciante", FetchMode.JOIN);
		return criteria.list();
	}

onde estarei carregando os objetos desnecessariamentes, pois como pagino o resultado em 10 e 10.
com o join carregarei logo os 100 objetos, ja com o OSIV vou carregando a medida que o usuário for avançado.

O que eu gostaria mesmo de saber, é se tem como OSIV manter a sessão aberta em algumas paginas espeficicas, no caso, as de resultado de busca!

Att. Dirceu

Criado 30 de julho de 2008
Ultima resposta 30 de jul. de 2008
Respostas 2
Participantes 2