Hibernate + Annotation: Lazy não funciona

9 respostas
V

Pessoal, está ocorrendo o seguinte
quando faço um “from RecMonitorado” ele faz um select pra trazer os dados dessa tabela, porém faz mais um pra cada Recurso que tiver nela.
Ex:
RecMonitorado com 3 registros resulta em
1 select em RecMonitorado
3 selects em Recurso

aqui vai o mapeamento:

RecMonitorado

@Entity
@Table(name="recmonitorado")
public class RecMonitorado implements Serializable {
	
	private RecMonitoradoPK id;
	private Especialidade especialidade;

	@EmbeddedId
	public RecMonitoradoPK getId() { return id; }
	public void setId(RecMonitoradoPK id) { this.id = id; }
	
	@ManyToOne(fetch=FetchType.LAZY)	
	@JoinColumn(name="codespec")
	public Especialidade getEspecialidade() { return especialidade; }
	public void setEspecialidade(Especialidade especialidade) { this.especialidade = especialidade; }

}

RecMonitoradoPK

@Embeddable
public class RecMonitoradoPK implements Serializable{
	
	private Recurso codrecurso;
	
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="codrecurso")
	public Recurso getCodrecurso() { return codrecurso; }
	public void setCodrecurso(Recurso codrecurso) { this.codrecurso = codrecurso; }
	
}

Obrigado

9 Respostas

V

mais uma coisa
não sei se influencia ou não, mas estou usando Spring também

Alexandre_Vilas_Boas

Se teu código tentar acessar getRecurso enquanto a sessão estiver aberta, o hibernate carrega pra você(faz o select) então precisa ver no código isso.

Se tentar acessar com a sessao encerrada, uma exception é lançada.

V

então, mas eu faço simplesmente isso:

getTemplate().find("from RecMonitorado");

mas nada
só de rodar o hql ele gera td isso

Alexandre_Vilas_Boas

Olha só, Recurso voce informou p/ hibernate que é teu id quando anotou com @EmbeddedId a classe RecMonitoradoPk

não tem como o hibernate te retornar o objeto sem carregar o id

V

quer dizer então q se eu quiser apenas pegar os dados da tabela recMonitorado, o hql ficará assim:

select obj.id.codrecurso.id, obj.especialidade.id from RecMonitorado obj

é isso ?

Alexandre_Vilas_Boas

Coloca o código das classes Recurso, Especialidade e desse método onde esta recuperando o RecMonitorado:

V

Recurso

@Entity
@Table(name="recurso")
public class Recurso implements Serializable {

    private String id; 
    
    private Especialidade especialidade;
    
    private String  	nome,
    		nomeoriginal,
    		email;
    private Boolean ajustar;
    private Carga carga;
    private CategRecurso codcategrecurso;
    private TipoRecurso codtiporecurso;
        
    @Id
    @Column(name="codrecurso")
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    
    @Column(name="ajustar")
    public Boolean getAjustar() { return ajustar; }
    public void setAjustar(Boolean ajustar) { this.ajustar = ajustar; }
    
    @Column(name="email")
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    
    @Column(name="nome")
    public String getNome() { return nome; }
    public void setNome(String nome) {this.nome = nome; }
    
    @Column(name="nomeoriginal")
    public String getNomeoriginal() { return nomeoriginal; }
    public void setNomeoriginal(String nomeoriginal) { this.nomeoriginal = nomeoriginal; }
    
    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="codcarga")
    public Carga getCarga() { return carga; }
    public void setCarga(Carga carga) { this.carga = carga; }
    
    @OneToOne(fetch=FetchType.LAZY)
    @JoinTable(
	    name="recmonitorado",
	    joinColumns=@JoinColumn(name="codrecurso"),
	    inverseJoinColumns=@JoinColumn(name="codespec")
    )
    public Especialidade getEspecialidade() { return especialidade; }
    public void setEspecialidade(Especialidade especialidade) { this.especialidade = especialidade; }
    
    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="codtiporecurso")
    public TipoRecurso getCodtiporecurso() { return codtiporecurso; }
    public void setCodtiporecurso(TipoRecurso codtiporecurso) { this.codtiporecurso = codtiporecurso; }
    
    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="codcategrecurso")
    public CategRecurso getCodcategrecurso() { return codcategrecurso; }
    public void setCodcategrecurso(CategRecurso codcategrecurso) { this.codcategrecurso = codcategrecurso; }
    
}

Especialidade

@Entity
@Table(name="especialidade")
public class Especialidade implements Serializable {

	private String  id, 
		nome;
	private Carga carga;
	
	private Collection<Recurso> recurso;
	private Collection<GrupoMonitorado> gruposmonitorados;
	
	@Id
	@Column(name="codespec")
	public String getId() { return id; }
	public void setId(String id) { this.id = id; }
	
	@Column(name="nome")
	public String getNome() { return nome; }
	public void setNome(String nome) { this.nome = nome; }
	
	@OneToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="codcarga")
	public Carga getCarga() { return carga; }
	public void setCarga(Carga carga) { this.carga = carga; }
	
	@OneToMany(fetch=FetchType.LAZY)
	@JoinTable(
			name="recmonitorado",
			joinColumns=@JoinColumn(name="codespec"),
			inverseJoinColumns=@JoinColumn(name="codrecurso")
	)
	public Collection<Recurso> getRecurso() {return recurso;}
	public void setRecurso(Collection<Recurso> recurso) {this.recurso = recurso;}	

	@OneToMany(fetch = FetchType.LAZY)
	@JoinTable(
			name="itemgrupomonitorado",
			joinColumns=@JoinColumn(name="codespec"),
			inverseJoinColumns=@JoinColumn(name="codgrupomonitorado")
	)
	public Collection<GrupoMonitorado> getGruposmonitorados() { return gruposmonitorados; }
	public void setGruposmonitorados(Collection<GrupoMonitorado> gruposmonitorados) { this.gruposmonitorados = gruposmonitorados; }
	
}

quanto ao código, ele só tem aquilo mesmo
não uso o resultado em nada, tanto q depois ele dá um return e volta pra tela…
só fiz pra testar pq estava fazendo um processamento e vi q estava fazendo muito select no log… muito mais do q o q eu achei q seria necessário, aí fiz isso pra testar e deu isso

Alexandre_Vilas_Boas

Alexandre Vilas Boas:
Olha só, Recurso voce informou p/ hibernate que é teu id quando anotou com @EmbeddedId a classe RecMonitoradoPk

não tem como o hibernate te retornar o objeto sem carregar o id

Oi Victor, é isso mesmo que tinha dito.

como teu select (getTemplate().find(“from RecMonitorado”);) vai retornar todos registros da tabela recmonitorado, no log do hibernate você sempre vai encontrar um select na tabela recmonitorado e n selects em recurso para retornar os ids desses registros

vamos supor que na tabela recmonitorado tenha 1000 registros.

se no select que vc montar retornar 25 registros, teremos no log:
1 select em RecMonitorado
25 selects em Recurso

se no select que vc montar retornar 1 registro, teremos no log:
1 select em RecMonitorado
1 select em Recurso

[]'s

V

beleza, valeu alexandre…
é q eu não tava pensando como objetos… hehehehe
achei q o “from Tabela” daria só select na tabela pra trazer dados dela apenas

Criado 1 de fevereiro de 2007
Ultima resposta 5 de fev. de 2007
Respostas 9
Participantes 2