Este artigo resume quatro maneiras de resolver o problema do carregamento preguiçoso do hibernado no processo de aprender hibernado.
O chamado carregamento preguiçoso é atrasado, carregando atrasado.
Quando usar o carregamento preguiçoso? Só posso responder isso quando você quiser usar carregamento preguiçoso, use carregamento preguiçoso.
Quanto ao motivo pelo qual precisamos usar o carregamento preguiçoso, é óbvio que, quando a quantidade de dados que queremos acessar é muito grande, obviamente não é adequado usar o cache, porque a capacidade de memória é limitada. Para reduzir a quantidade de simultaneidade e reduzir o consumo de recursos do sistema, deixamos os dados ser carregados quando necessário e depois usamos o carregamento preguiçoso.
Por exemplo, existe um objeto que é funcionário e outro objeto que é o departamento. Obviamente, para o funcionário, é um relacionamento muitos para um em comparação com o departamento e, para o departamento, é um relacionamento de um para muitos em comparação com o funcionário. Quando consultarmos o objeto do funcionário, se quisermos consultar o departamento correspondente através do departamento de propriedade do objeto do funcionário, uma exceção será lançada. Isso ocorre devido à existência de carregamento preguiçoso. Após o fechamento da sessão, o Hibernate emite outra solicitação ao banco de dados e uma exceção é lançada.
A seguir estão quatro maneiras de resolver esse problema:
1. Inicialização explícita (dentro do método de consulta)
Ao perguntar a qual departamento um funcionário pertence, você precisa pré-marcar o departamento
Declaração de uso
Hibernate.initialize (departamento.class);
2. Modifique o arquivo de relacionamento de objeto e reescreva preguiçosa preguiçosa = false, isto é, um carregamento preguiçoso fechado
Os dois métodos acima podem realmente resolver o problema, mas a desvantagem é que, independentemente de o objeto ser usado posteriormente, o Hibernate emitirá instruções SQL ao banco de dados para solicitar dados, causando desperdício de desempenho desnecessário.
3. Use filtros (projeto da web)
① A maneira de obter a sessão deve usar o getCurrentSession
② Método da sessão de fechamento especial
Public void Dofilter (Solicitação de servletRequest, resposta servletResponse, filtragem arg2) lança IoException, servletexception {// TODO Auto-Generated Method Stub Session Session = NULL; Transação tx = nulo; tente {session = hibernateutil.getCurrentSession (); tx = session.BegIntransaction (); arg2.dofilter (solicitação, resposta); // solicitações estão constantemente indo tx.commit (); } Catch (Exceção e) {// TODO: lidar com exceção se (tx! = null) {tx.rollback (); }} finalmente {// Método de fechamento especial hibernateUtil.closEcurrentSession (); }}4. Na estrutura SSH, use o OpenSessionView fornecido pela primavera
O princípio é semelhante ao uso do filtro no terceiro método, exceto que esse filtro é fornecido pela primavera. Ao usá -lo, você só precisa configurá -lo no arquivo web.xml da seguinte maneira:
<!-Use o Spring para resolver problemas de carregamento preguiçoso-> <filter> <filter-name> OpenSessionInViewFilter </ftrid-Name> <filter-Class> org.springframework.orm.hibernate3.support.opensessionInviewFilter </filter-class> </filter> <filter-Mapping> <name> openViendfilter </filtro-class> </filter> <filter-Mapping> <name> openinVerlinfilter <url-pattern>/*</url-tattern> </filter-Mapping>
Os métodos em 3 e 4 também podem resolver o problema do carregamento preguiçoso, e o quarto método também é usado com mais frequência no momento. No entanto, esses dois métodos também têm desvantagens. A desvantagem é que eles prolongam o tempo em que a sessão é fechada e o ciclo de vida da sessão se torna mais longo. Antes de usar esse método, a sessão foi fechada após a consulta de dados; Agora, a sessão está fechada no final de uma solicitação da Web.
Resumir
O exposto acima é sobre as quatro maneiras de resolver o problema do carregamento preguiçoso do hibernado. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!