-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 
Author Message
 Post subject: cglib component et getter
PostPosted: Tue Jan 24, 2006 5:16 am 
Newbie

Joined: Fri Mar 05, 2004 8:55 am
Posts: 19
Hibernate version:3.1

Mapping documents:

Code:
<class name="Dossier" >
    <component name="banque" class="Banque" >                   
          <property name="codeBanque"  type="string"  />
           <property name="codeGuichet"  type="string" />
           <property name="numCompte"  type="string"  />         
   </component>   


...

ma classe dossier a un attribut banque initialisé comme suit :
Code:
private Banque banque = new Banque();



j'instancie un objet persistant dossier mais toutes les données bancaires sont a null dans l'objet banque, j'ai bien une instance de banque dans mon objet dossier.

cet objet dossier est modifié par CGLIB (on le voit bien dans un debugeur).

quand j'essaie d'acceder a cet objet via le getter :
Code:
dossier.getBanque();

j'ai en retour un objet null si toutes les propriétés de banque sont nulles ...


est-ce normal ? y-a-t-il un moyen d'avoir une instance vide ?

merci
David


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 24, 2006 1:05 pm 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Je pense que c'est hibernate qui voyant que tous les attributs de ton composant sont null retourne null (à vérifier dans les sources)
Un autre moyen serait de modifier ton getter pour faire
Code:
public Banque getBanque()
{
  if (banque == null)
  {
    banque = new Banque();
  }
  return banque;
}

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 6:28 am 
Newbie

Joined: Fri Mar 05, 2004 8:55 am
Posts: 19
effectivement, c'est bien ce qui se passe.
Ce comportement me parait quand meme anormal.
cela porte a confusion. la variable est initialisé dans certains cas (transient,...) et parait nulle dans le cas ou toutes les propriétés sont nulles !!!


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 7:52 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Pourquoi est elle initalisée dans le cas de transient ? C'est toi qui choisit de l'initialiser ou pas dans ce cas, je ne pense pas qu'hibernate de force à avoir cette variable initialisée

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 10:23 am 
Newbie

Joined: Fri Mar 05, 2004 8:55 am
Posts: 19
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....


Top
 Profile  
 
 Post subject: Re: cglib component et getter
PostPosted: Thu Jan 26, 2006 11:25 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
yopiyop wrote:
est-ce normal ? y-a-t-il un moyen d'avoir une instance vide ?

Oui
Ecrit un UserType pour implémenter l'autre comportement

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 12:04 pm 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
C'est bien ce que je dis, c'est parce que tu initialise une instance de Moteur vide que tu as une différence. Mais prenons un autre cas maintenant : hibernate retourne une instance vide, moi je n'initalise pas ma variable car je veux qu'en transient il y ait null : j'ai une différence.

Le problème que tu poses est insoluble, c'est pour ça que selon moi le plus propre est de le gérer dans le getter

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 27, 2006 5:34 am 
Newbie

Joined: Fri Mar 05, 2004 8:55 am
Posts: 19
scesbron wrote:
C'est bien ce que je dis, c'est parce que tu initialise une instance de Moteur vide que tu as une différence. Mais prenons un autre cas maintenant : hibernate retourne une instance vide, moi je n'initalise pas ma variable car je veux qu'en transient il y ait null : j'ai une différence.

Le problème que tu poses est insoluble, c'est pour ça que selon moi le plus propre est de le gérer dans le getter


ok, c'est toujours contournable.

merci


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.