Hibernate não popula collection quando eu uso HQL? o.O

Fala galera, cá estou com mais uma dúvida :stuck_out_tongue:

Só espero que seja seja mais fácil =/

O problema é o seguinte: Eu tenho uma classe chamada usuário e uma outra chamada AbstractCommandTurno. Por causa de uma lógica de negócio diferente, eu preciso armazenar os comandos dos usuários num Set de usuário. Isso acontece por que o comando não é executado no momento, mas sim, posteriormente, de turnos em turnos. Então usuário possui um Set chamado "comandosPendentes".

Como podemos ver, essa classe de comandos é abstrata e possui dois comandos concretos "Constroi1" e "Constroi2" que são mapeados em tabelas diferentes (estratégia tabela por sub-classe).

O problema acontece quando eu entro nesse "turno" e quero executar esses comandos. Eu busto todos os usuários utilizando a consulta HQL : "FROM usuario u" e depois itero. O problema é que o Hibernate não popula o set! Já coloquei ele como lazy true e false e não muda nada. Já fiz até outer joins.

O engraçado é que o comando é salvo no banco de dados. Por que ele aparece nas suas tabelas. Alguém tem alguma sugestão?

Abaixo os mapeamentos:

Usuario.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="Usuario" table="usuario" >
        <id name="id" type="int">
            <column name="idUsuario" />
            <generator class="native" />
        </id>
        <property name="nick" type="string">
            <column name="nick" length="25" unique="true" />
        </property>
        <property name="senha" type="string">
            <column name="senha" length="25" />
        </property>
        <property name="email" type="string">
            <column name="email" length="50" />
        </property>
        <one-to-one name="Endereco"
        	class="Endereco"
        	property-ref="usuario"
        />
        <many-to-one
        	name="tipo"
        	column="idTipo"
        	class="Tipo"
        	not-null="true"        	
        />
        <map 
        	name="creditos" 
        	lazy="true" 
        	inverse="true"
        	cascade="save-update"
        	>
        	<key column="idUsuario" />
        	<index column="nome" type="string" />
        	<one-to-many class="Creditos"/>
        </map>
        <set 
        	name="comandosPendentes" 
        	lazy="true" 
        	inverse="true"
        	cascade="all"        	
        	>
        	<key column="idUsuario" />
        	<one-to-many class="comandos.AbstractCommandTurno"/>
        </set>        
    </class>
</hibernate-mapping>

AbstractCommandTurno.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="comandos.AbstractCommandTurno" table="comandoturno">
        <id name="id" type="int">
            <column name="idComandoTurno" />
            <generator class="native" />
        </id>
        <many-to-one name="usuarioDono" class="Usuario" cascade="all" >
            <column name="idUsuario" not-null="true" />
        </many-to-one>
        <property name="qtdTotalTurnos" type="int">
            <column name="qtdTotalTurnos" />
        </property>
        <property name="qtdTurnos" type="int">
            <column name="qtdTurnos" />
        </property>
	    <joined-subclass name="comandos.Constroi1" table="Constroi1">
	        <key column="idComandoTurno" />
	    </joined-subclass>
	    <joined-subclass name="comandos.Constroi2" table="Constroi2">
	        <key column="idComandoTurno" />
	    </joined-subclass> 	            
    </class>
</hibernate-mapping>

Pelo amor de Deus, alguém pode me ajudar? =(

Hum, pesquisei um tanto aqui e parece certo.

Qual o SQL gerado pelo Hibernate ao marcar lazy=false no one-to-many?

E não estou te ajudando pelo amor de deus. Estou ajudando porque deu na telha.

Cara, eu te passo quando estiver em casa, ok?

Um detalhe importante é que dependendo do caso, se eu busco pelo método Session.get(), por exemplo, ele recupera o comando.

Só que quando eu uso a HQL, ele nem instancia o objeto. Eu uso o log4j e ele nao apresenta a mensagem de instanciação. Depois debuguei o código e vi que realmente ele não passa por lá. Não sei da onde ele está tirando o objeto usuário e por que não está pegando a collection. Não sei se ele faz algum cache ou algo assim.

Ah, e obrigado pela ajuda mesmo eu falando “pelo amor de Deus” :stuck_out_tongue:

Hum, vendo o exemplo no Hibernate in Action a única diferença significativa em seus mapeamentos é o atributo “cascade” declarado no many-to-one. O resto está igual.

Fala Lipe, muito obrigado pela ajuda.

Mas acabei conseguindo resolver (fico dois dias tentando descobrir o que era e só consigo descobrir quando estou caindo de sono…).

Bom, o problema é que eu tinha uma Thread responsável por rodar meus comandos. Sendo que eu possuo uma classe “HibernateUtil” (como no livro) e que possui duas variaveis thread-local: Uma para a sessão e outra para a transação.

O fato é que eu não me ligava que quando essa thread girava, ela mantinha a sessão anterior. Isso fazia com que ela possuísse o cache da sessão, com objetos em memória e, consequentemente, sem os comandos que entraram posteriormente. A unica coisa que eu fiz foi fechar a sessao da thread após cada solicitação. Pronto, tudo ficou lindo! Hehe

Muito obrigado pela ajuda =)