Olá, estou tendo um problema de LazyInitializationException do Hibernate no VRaptor 3.
Já incluí o HibernateCustomProvider no web.xml.
Buscando no forum encontrei um problema semelhante, o qual foi solucionado incluindo o pacote “br.com.caelum.vraptor.util.jpa” nos parâmetros de contexto. Como eu faço para incluir esse pacote mais o meu pacote base da aplicação, separo por vírgulas? Tentei com vírgulas não funcionou, continuo com o mesmo erro.
[quote=Lucas Cavalcanti]vc tá usando o pacote do hibernate, que deixa a session aberta até o fim do request, então não deveria dar lazy initialization…
vc tá recebendo session ou sessionFactory como dependência das classes? [/quote]
Estou recebendo Session. E o controle de transação esta sendo feito normalmente via VRaptor.
Eu tenho uma lista de objetos que utilizo para popular uma combo e comparo os elementos dessa lista com um atributo do meu objeto pra selecionar um deles.
Eu estou recebendo a Session do VRaptor mesmo. Não crio ou altero Session em lugar algum nem mexo com Transaction ou SessionFactory…
Lembro que no meu TCC eu utilizei coisas semelhantes e não tive esse tipo de problemas. Será que pode ser algo da versão que estou utilizando? Não me lembro qual a versão que utilizei antes senão já teria tentado.
Ah, foi mal, esqueci de responder parte da pergunta… rsrs.
Mas então, eu tenho o método editar do meu controller, que busca uma instância específica do banco e adiciona ele ao meu result e em seguida eu uso um redirectTo.
O método esta assim:
public void editar(Long idMed, Long idConvenio) throws Exception {
Medico med = medicoDao.get(new MedicoId(idMed, idConvenio));
result.include("med", med);
result.redirectTo(MedicoController.class).listar(null);
}
E o listar esta assim:
public List<Medico> listar(Medico medico) throws Exception {
List<Medico> resp = null;
try {
result.include("especialidades", espDao.list());
resp = new Vector<Medico>();
if (medico != null) {
resp = medicoDao.list(medico);
} else {
resp = medicoDao.list();
}
} catch (Exception e) {
logger.error("Erro ao exibir página de médicos.", e);
result.include("msgNotif", "Erro ao listar médicos.");
}
return resp;
}
Você insistindo na pergunta me leva à seguinte pergunta: o fato de vir de um redirect influencia nisso?
vc incluiu o med no result, e fez um redirect. Isso gera outra requisição, ou seja, outra session, por isso dá lazy init.
vc pode inicializar a collection que vc precisa antes do redirect (chamando med.getEspecialidades().size() por exemplo).[/quote]
Não havia pensado nessa possibilidade… Muito obrigado…
E aproveitando o assunto, há alguma outra forma de se executar a lógica de outro método, além de chamar ele diretamente, sem que seja criada uma nova requisição? Eu vi um forwardTo aqui, ele serviria pra isso?