Je prends un exemple tout simple:
--------------------------------SQL--------------------------------
Code:
create table VOITURE(
id integer not null,
type varchar(255),
numero varchar(255),
primary key (id)
);
INSERT INTO VOITURE(id) values (1);
INSERT INTO VOITURE(id,type) values (2,'POLLUANT');
----------------------------------HBM--------------------------------
Code:
<class name="Voiture" >
<id name="id" type="integer" />
<component name="Moteur" >
<property name="type" type="string" />
<property name="numero" type="string" />
</component>
</class>
----------------------------------POJO--------------------------------
Code:
public class Voiture {
private int id;
private Moteur moteur = new Moteur();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Moteur getMoteur() {
return moteur;
}
public void setMoteur(Moteur moteur) {
this.moteur = moteur;
}
}
Code:
public class Moteur {
private String type = null;
private String numero = null;
public String getNumero() {
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
----------------------------------TEST--------------------------------
Code:
Configuration hc = new Configuration().configure();
SessionFactory sf = hc.buildSessionFactory();
//creation
try {
sf.getCurrentSession().beginTransaction();
Voiture v1 = (Voiture) sf.getCurrentSession().get(Voiture.class,Integer.valueOf(1));
Moteur moteur1 = v1.getMoteur();
System.out.println(moteur1); // ICI NULL !!!
Voiture v2 = (Voiture) sf.getCurrentSession().get(Voiture.class,Integer.valueOf(2));
Moteur moteur2 = v2.getMoteur();
System.out.println(moteur2); // ICI OK
Voiture v3 = new Voiture();
Moteur moteur3 = v3.getMoteur();
System.out.println(moteur3); // ICI OK EVIDEMENT
sf.getCurrentSession().getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
sf.getCurrentSession().getTransaction().rollback();
}finally{
sf.getCurrentSession().close();
}
---------------------------------------
J'initialise un moteur vide dans chaque instance de voiture.
hors dans le cas 1 (voir dans un debuggeur), la variable est ok mais le getter modifié par cglib (je crois ?) me renvoie null plutot que le contenu de ma variable.
c'est pour coller au cas n°3 (objet transient, pas encore persistent) que je pense que le comportement n'est pas normal...
imagine maintenant que dans ma classe moteur, je definisse une variable reelement transiente (dans le sens ou elle n'est pas mappée dans le hbm, elle), et que j'en ai besoin par defaut quand je charge un objet voiture....