English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Breve discussão sobre a solução do carregamento perezoso do Hibernate4essa maneira

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

Você também pode gostar