A principal pesquisa deste artigo é
O conceito de preguiçoso : carregue apenas um objeto quando ele é realmente usado.
A estratégia preguiçosa de Hibernate pode ser usada em:
1. Na tag <set>, o valor pode ser tomado: verdadeiro/false.
2. Na tag <erpoy>, o valor pode ser tomado: True/False, e a ferramenta de aprimoramento de classe é necessária para modificar o bytecode (isso não faz muito sentido).
3. Nas tags <Set> e <List>, os valores podem ser obtidos: TRUE/FALSE/extra.
4. Sobre as tags de associação de ponta única de <fir-tone> e <one-to-one>, você pode obter o valor: false/proxy/nphy
Vamos dar uma olhada na tag preguiçosa da classe:
User.java:
Public class Usuário {/ * id */private int id;/ * Nome do usuário */nome da string privada;/ * Senha do usuário */senha privada string;/ * Tempo de criação */data privada createTime; // omita o setter e os métodos getter}User.hbm.xml:
<? xml versão = "1.0"?> <! Doctype hibernate-mapping public "-// Hibernate/hibernate mapeando dtd 3.0 // pt" "http://hibernate.sourceforge.net/hibernate package = "com.lixue.bean"> <!-o nome do nó da classe representa o nome da classe da entidade, e a tabela representa o nome da entidade mapeada para a tabela no banco de dados-> <names name = "user" table = "t_user" "=" "> <idp =" id "> <generator" < /> <rator = "t_user">) <propriedade name = "senha" /> <names name = "createTime" /> < /class> < /hibernate-mapping>
Método de teste:
public void testLoad1 () {/*Obtenha o usuário, o próprio carregamento suporta carregamento preguiçoso (a tag de classe preguiçosa é válida para propriedades ordinárias)*/usuário do usuário = (Usuário) HibernateUtils.getSession (). Loadin (Usern.Class, 1);/*não emitirá SQL (porque o ID é especificado quando você quer que seja, não há necessidade de verificação); user.getId ());/* emitirá SQL, porque os atributos são realmente necessários no momento, a instrução SQL será emitida e a declaração emitida encontrará todos os atributos, e os atributos subsequentes não emitirão declarações*/System.out.println ("user.name =" + user.getName ()); nome)*/System.out.println ("user.password =" + user.getpassword ());/*não emitirá SQL (foi descoberto ao verificar o nome)*/System.out.println ("user.createTime =" + user.getCreateTime ());} Tente um ponto de interrupção no User user = (User) HibernateUtils.getSession().load(User.class, 1); Para testes!
O objeto aparecerá no usuário do objeto-> Handler ---> Nó de destino, como mostrado na figura:
1. No início, o alvo é nulo. Quando user.getId() é executado, ele ainda é nulo, porque o ID já está especificado quando consultamos, por isso não faz sentido consultar neste momento.
2. Ao executar user.getName() , uma instrução é emitida, conforme mostrado na figura:
A partir da figura, podemos ver que, ao consultar o ID, nenhuma declaração foi emitida. Como acabamos de mencionar, quando consultarmos o atributo de nome, emitimos uma declaração e a função dessa afirmação é para consultar todos os atributos.
3. Quando user.getPassword() e user.getCreateTime() forem executados, a instrução não será mais emitida porque o valor do atributo já foi consultado antes.
NOTA: A tag preguiçosa na <Class> suporta apenas atributos normais e não afetará o carregamento de coleções na classe.
O exposto acima é sobre preguiçosos na tag <SceLT> do carregamento preguiçoso de Hibernate, 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!