Hibernate - many-to-one

Pessoal,

Tenho um relacionamento many-to-one entre as entidades Setor e SequenciaAtendimento. Nesse relacionamento um setor pode ter várias sequências de atendimento. Estou tendo problema para recuperar as informações do Setor através da consulta por sequênciaAtendimento. O problema pode ser resolvido alterando a propriedade lazy para false, entretanto isso vai comprometer o desempenho do meu BD. Como faço para recuperar as informações dos setores, tais como id (chave composta), sem que o lazy seja igual a false?

Beans:

public class SequenciaAtendimento implements Serializable {
     	private Setor setor;

	public Setor getSetor() {
		return this.setor;
	}

	public void setSetor(Setor setor) {
		this.setor = setor;
	}
}
public class Setor implements Serializable {
    private SetorId id;
    private Set<SequenciaAtendimento> sequenciaAtendimentos = new HashSet<SequenciaAtendimento>();

	public SetorId getId() {
		return id;
	}

	public void setId(SetorId id) {
		this.id = id;
	}

	public Set<SequenciaAtendimento> getSequenciaAtendimentos() {
		return sequenciaAtendimentos;
	}

	public void setSequenciaAtendimentos(
			Set<SequenciaAtendimento> sequenciaAtendimentos) {
		this.sequenciaAtendimentos = sequenciaAtendimentos;
	}
}

Mapeamentos:

SequenciaAtendimento.hbm.xml

        <many-to-one name="setor" class="br.com.itautec.siga.bean.Setor" update="false" insert="false" fetch="select">
            <column name="nrseq_agencia" not-null="true" />
            <column name="cod_setor" not-null="true" />
        </many-to-one>

Setor.hbm.xml

		<set name="sequenciaAtendimentos" inverse="true">
			<key>
				<column name="nrseq_agencia" not-null="true" />
				<column name="cod_setor" not-null="true" />
			</key>
			<one-to-many class="br.com.itautec.siga.bean.SequenciaAtendimento" />
		</set>

Após a busca por todos SequenciaAtendimento, se fizer sequenciaAtendimento.getSetor().getId() recebo valor null. Se colocar o lazy=“false” recebo o valor desejado. Não quero lazy=“false” porque compromete o desempenho do meu BD.

Valeu

quando você tem o relacionamento e um padrão lazy, acontece da seguinte forma:

se a sessão que você usou para obter o sequencia ainda estiver aberta, quando você da o getSetor nela, o hibernate faz a query e monta o objeto para você na hora, se ja estiver fechada, então você precisa dar um merge nele e depois chamar o getSetor para obter o mesmo resultado (não tenho certeza se o refresh resolve). Outra forma seria você pensar nisso e popular esse objeto com antecedência ainda antes da sessão antiga fechar, com a hql você pode usar um fetch join e com criteria você pode usar o método setFetchMode(“nomeDoAtributoSetorEmSequenciaAtendimento”, FetchMode.EAGER), ambos os casos aproveitam o comportamento eager apenas nessa consulta mantendo lazy para qualquer outra coisa.

Resolvi o problema com getSetor() antes do fechamento da sessão.

Muito Obrigado

Para aqueles que venham ter o mesmo problema, segue um link interessante explicando o que o maior_abandonado escreveu: http://docs.jboss.org/hibernate/core/3.5/reference/pt-BR/html/performance.html#performance-fetching

esse setFetchMode até resolve, porém se reparar no sql gerado é o mesmo se eu deixar lazzy == false no mapeamento xml.