English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artigo resume as quatro maneiras que encontrei para resolver problemas de carregamento perezoso no Hibernate durante o meu aprendizado.
O que se entende por carregamento perezoso (lazy) é carregamento atrasado, carregamento diferido.
Quando usar carregamento perezoso? Eu só posso responder que usar carregamento perezoso quando for necessário.
Afinal, por que usar carregamento perezoso? É claro que não é apropriado usar cache quando temos que acessar uma quantidade enorme de dados, pois a capacidade de memória é limitada. Para reduzir o volume de concorrência e o consumo de recursos do sistema, fazemos com que os dados sejam carregados quando necessário, e é aí que entramos em cena o carregamento perezoso.
Por exemplo, há um objeto chamado Employee e outro objeto chamado Department. Obviamente, para Employee em relação ao Department, é uma relação de muitos para um; e para Department em relação ao Employee, é uma relação de um para muitos. Quando consultamos o objeto Employee, se esperarmos obter o Department correspondente através da propriedade department do objeto employee, será lançada uma exceção. Isso é porque existe o carregamento perezoso, após o fechamento da session, o hibernate novamente envia uma solicitação ao banco de dados, resultando em uma exceção.}
A seguir, resumo as quatro maneiras de resolver esse problema:
1.inicialização explícita (dentro do método de consulta)
Para consultar a qual departamento pertence um funcionário específico, é necessário consultar Department previamente
usar a sentença
Hibernate.initialize(Department.class);
2.modificar o arquivo de relação de objeto, escrever lazy como lazy=false, ou seja, desativar o carregamento perezoso
Essas duas maneiras, realmente podem resolver o problema, mas a desvantagem é que, independentemente de usar o objeto posteriormente, o hibernate sempre enviará instruções SQL para o banco de dados para solicitar dados, causando desperdício de desempenho desnecessário.
3.usar o filtro (projeto web)
① A maneira de obter a session deve usar getCurrentSession
② Método de fechamento especial da session
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException { // TODO Auto-esqueleto de método gerado Session session = null; Transaction tx = null; try { session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); arg2.doFilter(request, response);//A solicitação continua tx.commit(); } catch (Exception e) { // TODO: lidar com exceção if(tx != null){ tx.rollback(); } finally{ //Método de fechamento especial HibernateUtil.closeCurrentSession(); } }
4No framework SSH, use o openSessionView fornecido pelo spring
Seu princípio é semelhante ao terceiro método usando Filter, mas esse filter é fornecido pelo spring. Ao usar, é necessário configurar no arquivo web.xml conforme abaixo:
<!-- Uso do spring para resolver problemas de carregamento perezoso --> <filtro <filtro-nome>OpenSessionInViewFilter</filtro-nome> <filtro-classe>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filtro-classe> </filtro> <filtro-mappamento> <filtro-nome>OpenSessionInViewFilter</filtro-nome> <url-padrão>/*</url-padrão> </filtro-mappamento>
e3e4Essa abordagem também pode resolver o problema de carregamento perezoso, onde o número4Esses métodos também são os mais usados atualmente. No entanto, esses dois métodos também têm desvantagens, a saber, prolongar o tempo de fechamento da sessão, tornando a vida útil da sessão mais longa. Antes de usar esse método, a sessão era fechada após a consulta de dados; agora, o fechamento da sessão é feito no final de uma solicitação web.
Resumo
Aqui está uma breve discussão sobre como resolver o carregamento perezoso do Hibernate4Esse método contém todo o conteúdo, esperando ajudar a todos. Amigos interessados podem continuar a ler outros tópicos relacionados no site, e são bem-vindos a deixar comentários sobre pontos insuficientes. Agradecemos o apoio dos amigos ao site!
Declaração: O conteúdo deste artigo é extraído da internet, pertence ao autor original, é contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de infringir direitos autorais, por favor, envie e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Em caso de verificação, o site deletará imediatamente o conteúdo suspeito de infringir direitos autorais.)