Este artigo descreve o princípio e o método de implementação do carregamento de atraso de hibernato. Compartilhe -o para sua referência, como segue:
Para otimizar ainda mais o desempenho do Hibernate, você pode usar:
Tecnologia de carregamento de latência, gerenciamento de estratégias de rastreamento de dados e executando o gerenciamento de cache para melhorar o desempenho do hibernato.
1. Carregamento de atraso (carga)
O carregamento preguiçoso é um mecanismo fornecido pelo Hibernate para melhorar a eficiência da execução do programa, ou seja, será criada apenas quando os dados do objeto forem realmente usados.
O processo de carregamento preguiçoso: o carregamento de atraso é alcançado através do mecanismo de proxy. Quando o hibernato obtém dados de um determinado objeto de um banco de dados, ao obter o valor do atributo de coleta de um objeto ou ao obter outro objeto associado a um objeto, uma vez que os dados do objeto não são usados (exceto o identificador), o hibernato não carrega os dados reais do banco de dados, mas apenas cria um objeto proxy para representar o objeto. Todos os atributos nesse objeto são os valores padrão; Esse objeto real é criado apenas quando os dados do objeto são realmente necessários para ser usado e seus dados são realmente carregados no banco de dados.
Quando o método load () na sessão é chamado para carregar uma entidade; Quando a sessão carregar uma entidade, o valor do atributo de coleção na entidade será carregado com carregamento tardio; Quando a sessão carrega uma entidade, a outra entidade objeto de que a entidade é de ponta única, o carregamento tardio será usado para outro objeto de entidade associado ao único
Desligue o carregamento preguiçoso: ao carregar uma única entidade, você pode usar o método get ().
Para atributos de coleção em entidades, você pode adicionar atributo lazy = "false" a este conjunto (<Set>, <bag>, <List>…). Quando uma associação de ponta única de outro objeto de entidade, você pode configurar <one-to-one>, <Many-to-One> para adicionar atributo lazy = "false" no arquivo de mapeamento NOTA: One para um não pode ter restringido = true (a chave estrangeira é exibida na instrução SQL gerada), caso contrário, a carga preguiçosa não funcionará.
2. Os principais tipos de carregamento preguiçoso são usados em hibernado por padrão:
• O carregamento preguiçoso é usado quando o método de carga () na sessão é chamado para carregar uma entidade.
• Quando uma sessão carrega uma entidade, os valores do atributo de coleção nesta entidade são carregados com atraso. (um para muitos)
• Quando uma sessão carrega uma entidade, outro objeto de entidade é de ponta única (um para um, muitos para um) associado à entidade é carregado preguiçoso.
• A diferença entre o segundo e o terceiro é: no segundo caso, o método para cancelar o atraso no carregamento é definir o atributo de carregamento preguiçoso preguiçoso = "false" após a etiqueta definida do arquivo de mapeamento da parte que tem o atributo definido; No terceiro caso, a tag de muitos para um no arquivo de mapeamento das várias partes que possui muitos para um, ou seja, a tag de muitos para um está definida.
Objetos que podem ser carregados preguiçosos são todos objetos de proxy reescritos. Quando a sessão associada não estiver fechada, acessar as propriedades desses objetos lentosos (proxy) (exceto getId e getClass) hibernate inicializará esses proxy ou usará hibernate.initialize (proxy) para inicializar objetos proxy; Quando a sessão associada estiver fechada, ocorrerá uma exceção para acessar o objeto lento carregado.
3. Estratégia de rastreamento (busca)
Configure a "política de rastreamento" para afetar diretamente o efeito de consulta dos métodos get () e load () da sessão.
Estratégia de rastreamento em associação única <fast-to-one> <one-to_one>:
Você pode adicionar atributos de busca aos elementos de mapeamento associados de extremidade única. Selecione: carregamento de atraso; Junte-se: use uma conexão intra na mesma instrução SELECT para obter os dados do objeto e os dados de seu objeto associado. No momento, o carregamento de atraso do objeto associado é inválido.
Estratégia de rastreamento nas propriedades de coleta :
Selecione: carregamento de atraso; Junte-se: Use intra-Jogando na mesma instrução SELECT para obter o conjunto de associações da outra parte. Neste momento, o preguiçoso no conjunto associado será inválido. SUBSELHO: Envie outra declaração de consulta ou subconsulta para rastejar. Essa estratégia também funciona para consultas HQL.
4. Análise de caso de carga preguiçosa
Caso 1: Uma única entidade chama o método load () para cancelar o carregamento preguiçoso
pacote com.hbsi.test; importar org.hibernate.session; importar org.junit.test; importar com.hbsi.domain.user; importar com.hbsi.utils.hibernateUtil; sessionClass testLazy {// teste get () get () o método) sempre executará sql sloTentsTensTer. Hibernateutil.getSession (); usuário do usuário = (usuário) session.get (user.class, 1); // system.out.println (user.getName ()); hibernateutil.close (); // observe aqui: se a sessão estiver fechada e o usuário estiver no estado gerenciado, o objeto do usuário ainda pode ser usado; Isso ocorre porque, embora esteja no estado gerenciado, esse objeto é um objeto com valores de atributo e não o exclui, mas isola apenas o canal para lidar com o banco de dados. System.out.println (user.getName ());} // testload () método; Não execute a instrução SQL e execute apenas @testpublicvoid testload () {session session = hibernateutil.getSession (); usuário user = (user) session.load (user.class, 1); // O ID de saída aqui não executará a instrução SQL. Ele obterá diretamente o ID do ID que você passou acima. Ele não é pesquisado no banco de dados, portanto, o SQL Declaration System.out.println (user.getId ()); // O nome de saída é diferente. Neste momento, o objeto proxy é realmente instanciado. Este é o objeto proxy com o atributo de nome. Neste momento, mesmo se você fechar a sessão, ainda poderá obter o nome através desse objeto. Se você comentar esta frase, ou seja, o objeto proxy não instancia o objeto proxy e executa o atributo do nome da saída após o fechamento da sessão, um erro será relatado: não poderia inicializar o proxy // System.out.println (user.getName ();Situação 2: Cancelar o carregamento preguiçoso no conjunto
Teste se a carga preguiçosa no atributo de coleção estiver definida como falsa no arquivo de mapeamento, ele será montado com os dados na tabela Ordens, ou seja, duas instruções selecionadas
@TestpublicVoid find () {sessão session = hibernateutil.getSession (); cliente cus = (cliente) session.get (client.class, 3); system.out.println (cus.getcname ()); // use o seguinte método para produzir as instruções SQL para dois dias e se separar; Se o carregamento preguiçoso for usado, duas instruções SQL serão emitidas primeiro e o resultado da saída é // o método não poderá ser diretamente encadeado aqui para produzir cus.getord (). getOname (); porque cus.getord () retorna um conjunto de conjuntos <ordens> ordens = cus.getord (); system.err.println (orders.size ()); hibernateutil.close ();}Método 3: <one-to-one>, <Many-tone> Cancelar carregamento preguiçoso
@TestpublicVoid find () {// Por padrão, carregamento preguiçoso, ou seja, saída um com uma instrução SQL; Se o carregamento de atraso estiver definido como False e Sair duas instruções SQL, serão encontradas informações indesejadas ao cliente. Sessão session = hibernateUtil.getSession (); ordens ord = (ordens) session.get (ordens.class, 3); system.out.println (ord.getOname ()); hibernateutil.close ();}Espero que a descrição deste artigo seja útil para a programação Java de todos com base na estrutura do Hibernate.