IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Hibernate] get renvoie null alors que la ligne existe en BD


Sujet :

Hibernate Java

  1. #1
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut [Hibernate] get renvoie null alors que la ligne existe en BD
    Salut à tous !

    Bon ben le problème est quasiment expliqué totalement dans le titre !

    Voici les détails quand même :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    // Class MyService
     
    createMyEntity(MyData data)
    {
      // do some work
      _myEntityDAO.createEntity(myEntity)
    }
     
    // Class EntityDAOImpl
     
    createEntity(myEntity)
    {
        if (myEntity.getId() != null)
        {
          saveEntity(myEntity, myEntity.getId());
        }
        else
        {
          saveEntity(myEntity);
        }
    }
    Après l'exécution de ce code, je me retrouve avec la ligne correspondante en BD (mySQL). Jusque là, tout va bien.

    par contre juste après je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
     
    // Class myService
    retrieveMyEntity(MyData data)
    {
     
      _myEntityDAO.getEntityByName(data.getName);
    }
     
     
    // Class EntityDAOImpl
     
    getEntityByName(String name)
    {
     
            Object[] values = { name };
            List entityList = getHibernateTemplate().find(
              "select t_entity " +
              "from Entity t_entity " +
              "where t_entity.name = ? ",
              values);
     
    }
    Et le getEntityByName me renvoie null, alors que si j'exécute la même requête dans MySQL Querry Brother, la ligne est correctement trouvée !

    Les détails :

    EntityDAOImpl hérite de org.springframework.orm.hibernate.support.HibernateDaoSupport

    Dans mon fichier de contexte Spring :

    <!-- General rule for read-only methods -->
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <!-- General rule for all other methods -->
    <prop key="*">
    PROPAGATION_REQUIRED
    </prop>
    <prop key="createEntity">
    PROPAGATION_REQUIRED
    </prop>
    Voila, je sèche, si vous avez une piste, vous êtes les bienvenus
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  2. #2
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Alors j'ai continué à creuser et voici mes premières trouvailles :

    Le bout de code qui m'embête est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    public void scan()
    {
       while (condition is true)
       {   
         String nameToCreate = getNextName();
         myEntity = myService.getEntityByName(nameToCreate);
     
         if (myEntity == null)
         {
            myService.createMyEntity(nameToCreate );
         }
       }
    }
    Donc voila.

    Je passe une première fois dans ma boucle avec comme nom par exemple "Toto".
    Le get me renvoie null (normal), donc je le créé.
    Après que l'instruction myService.createMyEntity(nameToCreate) se soit exécutée, si je vais voir en bd avec MySQL query browser, je vois bien la ligne correspondante.

    L'itération juste après, je me retrouve avec le même identifiant ("Toto"), mais le get me renvoie NULL ! (Je tape la requête dans MySQL QB, et là, bien sur je trouve la ligne).

    Un appercu du fichier de contexte Spring :

    <prop key="scan">
    PROPAGATION_REQUIRED
    </prop>
    <prop key="get*">
    PROPAGATION_REQUIRED, readOnly
    </prop>
    <prop key="create*">
    PROPAGATION_REQUIRED
    </prop>
    En bidouillant, je me suis aperçu, que, à la sortie du 1er create, aucun appel à transaction.commit() est effectué.

    Ce qui est normal, car cet appel à create se fait DÉJÀ dans une transaction (celle du scan).

    Bref, du coup, je me suis dit, on va mettre PROPAGATION_NOT_SUPPORTED pour la méthode "scan". Après avoir fait ça : plus de problèmes.
    Mais je me demande qd même (dans le cas qui ne marche pas), comment la ligne peut être en BD, et le getEntityByName("toto") puisse me renvoyer null .

    Voilà j'espère avoir été un peu plus clair que dans mon précédent post !
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  3. #3
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Bonjour tous !!

    Je continue mon monologue

    Alors, en continuant mes investigations, je me suis dit :

    Si la ligne existe en BD, et que mon dao.getBiduleByName me renvoie null, c'est qu'il ne génère pas de requête SQL, et du coup, que ce dao.getblabla, ne va pas voir en BD.
    Alors j'ai fait ceci :

    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.show_sql">true</prop>
    </props>
    </property>
    Et là, banco, mon dao.getBidule, ne génère pas de requête SQL...

    Ce qui me perturbe, c'est que, mon dao.getBidule se traduit plus loin dans le code par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return queryObject.list();
    Et j'ai cru comprendre que les Query.list()/Criteria.list() n'interrogeaient pas le cache... (Du coup, ils devraient aller voir direct en BD non??)

    Me suis-je trompé??
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour,

    A tout hasard, ne serait-ce pas plutôt un problème dans la méthode getEntityByName ?

    Si vous faîtes ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Class EntityDAOImpl
     
    getEntityByName(String name)
    {
             List entityList = getHibernateTemplate().find(
              "select t_entity " +
              "from Entity t_entity " +
              "where t_entity.name = ? ",
              name);
     
    }
    Cela ne fonctionne pas mieux ?

  5. #5
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Bonjour et merci de m'aider dans mon monologue !!

    Je viens d'essayer votre solution, et malheureusement, même problème, le dao.get* ne génère pas de requête SQL que je vois passer...

    Par contre, cela fonctionne si je remplace :

    <prop key="get*">
    PROPAGATION_REQUIRED, readOnly
    </prop>
    par :

    <prop key="get*">
    PROPAGATION_NOT_SUPPORTED
    </prop>

    !!
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

Discussions similaires

  1. Criteria Hibernate renvoie NULL alors qu'il devrait pas :S
    Par Disciple195 dans le forum Tomcat et TomEE
    Réponses: 10
    Dernier message: 19/06/2009, 10h45
  2. [AC-2002] Me.OpenArgs Null alors que ce n'est pas vrai
    Par jaffael dans le forum VBA Access
    Réponses: 3
    Dernier message: 08/06/2009, 17h32
  3. Réponses: 1
    Dernier message: 23/01/2008, 18h04
  4. Réponses: 4
    Dernier message: 20/09/2006, 16h58
  5. [VBA Access] Champ texte null alors que l'objet existe bien.
    Par Caroline1 dans le forum VBA Access
    Réponses: 9
    Dernier message: 28/03/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo