Bonjour,
je suis en train de tester Hibernate3 avec les annotation en intégrant le tout à Spring ...
Or lors lors du chargement d'un objet, tout le graph est chargé et non juste l'entité demandée.
Voici le fichier de mapping :
Code:
package com.itnsa.gestion.hibernate;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* Client generated by hbm2java
*/
@Entity
@Table(name = "F_P_CLIENT")
public class Client implements java.io.Serializable {
// Fields
private Long ident;
private Rib ribPrincipal;
private Personne personne;
private java.util.Set<com.itnsa.gestion.hibernate.ClientZoneLibre> zonesLibres;
// Constructors
/** default constructor */
public Client() {
}
/** constructor with id */
public Client(Long cliIdent) {
this.ident = cliIdent;
}
// Property accessors
/**
*
*/
@Id(generate = GeneratorType.AUTO)
@Column(name = "CLI_IDENT")
public Long getIdent() {
return this.ident;
}
public void setIdent(Long cliIdent) {
this.ident = cliIdent;
}
/**
*
*/
@ManyToOne
@JoinColumn(name = "CLI_BPR_IDENT")
public Rib getRibPrincipal() {
return this.ribPrincipal;
}
public void setRibPrincipal(Rib PRib) {
this.ribPrincipal = PRib;
}
/**
*
*/
@ManyToOne
@JoinColumn(name = "CLI_BPP_IDENT")
public Personne getPersonne() {
return this.personne;
}
public void setPersonne(Personne PPersonne) {
this.personne = PPersonne;
}
/**
*
*/
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "CLZL_CLI_IDENT")
public java.util.Set<com.itnsa.gestion.hibernate.ClientZoneLibre> getZonesLibres() {
return this.zonesLibres;
}
public void setZonesLibres(
java.util.Set<com.itnsa.gestion.hibernate.ClientZoneLibre> FPClientZls) {
this.zonesLibres = FPClientZls;
}
}
Le chargement est effectué de la manière suivante dans un DAO qui hérite de
HibernateDaoSupport :
Code:
public Collection findClientByNomAppel(String nomAppel) {
return getHibernateTemplate().find("from Client as client left join fetch client.personne where client.personne.nomAppel like 'TEST%'");
}
L'appel au DAO se fait dans une methode de service :
Code:
public void rechercheClient(String nomAppel) {
Iterator iter = this.clientDAO.findClientByNomAppel(nomAppel).iterator();
while (iter.hasNext()) {
Client client = (Client) iter.next();
System.out.println(client.getPersonne().getNomAppel());
}
}
Or quand je regarde les requêtes générées par hibernate (je m'attends à n'en avoir qu'une seule initialisant les clients et leurs personne), j'obtiens ceci :
Code:
Hibernate: select client0_. ..... personne0_. ...
Hibernate: select rib0_. ....
Hibernate: select rib0_. ....
Hibernate: select zoneslibre0_. ...
Hibernate: select zoneslibre0_. ...
J'ai du laisser passer quelque chose sur le fonctionnement du lazy-loading ... je ne comprends pas !
Merci de m'ouvrir les yeux sur ma boulette ;-)
Marco.