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 :

NullPointerException avec Hibernate sans plus de précision


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut NullPointerException avec Hibernate sans plus de précision
    Salut a tous,

    Voila je suis en train de vouloir insérer des données avec hibernate, j'ai donc créer mon bean et mon hbm. Le programme démarre normalement, mais quand j arrive a la page ou je dois insérer mes nouvelles données, éclipse me sort un null pointer exception mais sans me donner plus d explication.

    Voici ma fonction d insertion

    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 insert_question(String question) throws Exception
    	{
    		try
    		{
    			Session session = getSession();
    			Transaction tx = session.beginTransaction();
     
    			Nodes node = new Nodes();
     
    			node.setQuestion(question);
    			session.save(node);
     
    			tx.commit();
    		}
    et voici mon message d erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Grave: java.lang.NullPointerException
    	at com.dao.Node_dao.insert_question(Node_dao.java:48)
    la ligne 48 fait référence a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Transaction tx = session.beginTransaction();
    Comme mon message d erreur n est pas claire (enfin si il y est, il me donne le numéro de la ligne mais je vois pas pourquoi cette ligne coince), mon message est surement incomplet et peut être trop vaste.

    Quel partie du code devrais-je vous montrer pour avancer ? Sachant qu'il n y a rien de sorcier, c est juste un insertion d une question avec son id.

    Merkiiiiiiii

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    salut,

    utilises le mode debug de ton ide, ça te permettra d'avancer pas à pas dans l'exécution de ton code et d'avoir une idée assez précise de l'origine du problème.
    Ce qui est sûr c'est que tu as un objet quelque part qui n'a pas été instancier.

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,

    Ton objet session doit être null, peux tu effectivement vérifier ça en y allant en mode debug? et eventuellement nous faire voir le code source complet de ton DAO?
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Bonjour et merci

    Désolé pour le retard !

    J'ai essayer le mode debug mais je ne vois rien de nouveau.

    Voici ma dao complète

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    @Stateless 
    public class Node_dao 
    {	
    	@PersistenceContext (unitName = "MySqlConnPoll")
    	private EntityManager em;
     
    	private static SessionFactory sessionFactory;
     
    	private Session getSession()
    	{
    		Session session = null;
     
    		try
    		{
    			sessionFactory = new Configuration().configure("com\\xml\\hibernate.cfg.xml").buildSessionFactory();
    			session = sessionFactory.openSession();
    		}
    		catch(HibernateException e)
    		{
    			System.out.println(e.getMessage());
    		}
    		return session;
    	}
     
    	public void insert_question(String question) throws Exception
    	{
    		try
    		{
    			Session session = getSession();
    			Transaction tx = session.beginTransaction();
     
    			Nodes node = new Nodes();
     
    			node.setQuestion(question);
    			session.save(node);
     
    			tx.commit();
    		}
    		catch (HibernateException e)
    		{
    			System.out.println(e.getMessage());
    		}	
    	}
     
    	@SuppressWarnings("unchecked")
    	public Nodes select (HttpServletRequest request) throws Dao_exception
        {
            List <Nodes> nodeList = new ArrayList<Nodes>();
            nodeList = em.createQuery("SELECT n FROM Nodes n").getResultList();
     
            return nodeList.get(0);
        }
     
    	public Nodes getNodes(int id)
    	{
    		return em.find(Nodes.class, id);
    	}
    }
    Ce qui m intrigue c est que la ligne ou ce trouve l erreur c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Transaction tx = session.beginTransaction();
    alors que je vois pas ce qui ne fonctionne pas vue que j'ai utilisé un modèle assez simple

    merci

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2009
    Messages : 236
    Points : 491
    Points
    491
    Par défaut
    Hello,

    Si tu passe en debug, ta session factory te dit quoi? Je me demande si c'est pas juste qu'il a pas trouvé ton fichier de config

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Donne nous l'output complet de ta console, et au passage remplace ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		catch(HibernateException e)
    		{
    			System.out.println(e.getMessage());
    		}
    par ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		catch(HibernateException e)
    		{
    			e.printStackTrace();
    		}
    En l'occurence, ta session est null, et le seul moyen pour qu'elle soit nulle, c'est que ta sessionfactory lève une Exception.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Hello,

    Pour répondre a Malanika, je suis sur que mon session factory trouve mon fichier de config parce qu'avant d avoir l erreur, dans la console j ai quelques lignes qui me font comprendre que tout ce déroule bien a ce niveau la.

    Pour tchize_, voici ce que j'ai dans ma console

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Infos: configuring from resource: com\xml\hibernate.cfg.xml
    Infos: Configuration resource: com\xml\hibernate.cfg.xml
    Infos: Reading mappings from resource: com\\xml\\Nodes.hbm.xml
    Infos: Mapping class: com.beans.Nodes -> node
    Infos: Mapping collection: com.beans.Nodes.childNode -> node
    Infos: Reading mappings from resource: com\\xml\\Users.hbm.xml
    Infos: Mapping class: com.beans.Users -> user
    Infos: Configured SessionFactory: madb
    Infos: Repeated column in mapping for collection: com.beans.Nodes.childNode column: id
    Grave: java.lang.NullPointerException
    	at com.dao.Node_dao.insert_question(Node_dao.java:48)
    	at com.servlet.new_question.doPost(new_question.java:41)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    	at java.lang.Thread.run(Thread.java:744)
    Voila la seul explication que j'ai, je n'ai rien d autre sous la main pour m envoyer sur d autres pistes !

    merkii

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Je viens de faire un test en écrivant en brut la donnée dans ma dao. Ce qui fait

    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
    public void insert_question(String question) throws Exception
    	{
    		try
    		{
    			Session session = getSession();
    			session.beginTransaction();
    			
    			Nodes node = new Nodes();
    			
    			node.setQuestion("test insertion");
    			session.save(node);
    			
    			session.close();
    		}
    		catch (HibernateException e)
    		{
    			e.printStackTrace();
    		}
    	}
    Et l erreur est la même, donc je suppose que ce n est même pas du au faite qui ne trouve pas ce que je rentre dans le formulaire mais bien de la fonction.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    l'erreur, c'est que session est null, point. Puisque visiblement tu es dans une application web, peux-tu nous montrer l'entièreté du code de ta classe Node_dao?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Voici ma code entier de ma dao

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    @Stateless 
    public class Node_dao 
    {	
    	@PersistenceContext (unitName = "MySqlConnPoll")
    	private EntityManager em;
     
    	private static SessionFactory sessionFactory;
     
    	private Session getSession()
    	{
    		Session session = null;
     
    		try
    		{
    			sessionFactory = new Configuration().configure("com\\xml\\hibernate.cfg.xml").buildSessionFactory();
    			session = sessionFactory.openSession();
    		}
    		catch(HibernateException e)
    		{
    			System.out.println(e.getMessage());
    		}
    		return session;
    	}
     
    	public void insert_question(String question) throws Exception
    	{
    		try
    		{
    			Session session = getSession();
    			session.beginTransaction();
     
    			Nodes node = new Nodes();
     
    			node.setQuestion(question);
    			session.save(node);
     
    			session.close();
    		}
    		catch (HibernateException e)
    		{
    			e.printStackTrace();
    		}
    	}
     
    	@SuppressWarnings("unchecked")
    	public Nodes select (HttpServletRequest request) throws Dao_exception
        {
            List <Nodes> nodeList = new ArrayList<Nodes>();
            nodeList = em.createQuery("SELECT n FROM Nodes n").getResultList();
     
            return nodeList.get(0);
        }
     
    	public Nodes getNodes(int id)
    	{
    		return em.find(Nodes.class, id);
    	}
    }
    merci

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Déjà, quelques corrections d'ordre générique:

    public void insert_question(String question) throws Exception

    A éviter: on ne lance pas Exception, on lance des Exceptions précises.

    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
    private Session getSession()
    	{
    		Session session = null;
     
    		try
    		{
    			sessionFactory = new Configuration().configure("com\\xml\\hibernate.cfg.xml").buildSessionFactory();
    			session = sessionFactory.openSession();
    		}
    		catch(HibernateException e)
    		{
    			System.out.println(e.getMessage());
    		}
    		return session;
    	}
    Si tu as une exception (ce qui est probablement le cas ici), tu remonte une session vide, ça va juste être des galères supplémentaires après à gérer (comme on le voit). Remonte plutôt ton exception hibernate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private Session getSession() throw HibernateException
    	sessionFactory = new Configuration().configure("com\\xml\\hibernate.cfg.xml").buildSessionFactory();
    	return sessionFactory.openSession();
    	}
    Autre remarque: pourquoi tu crée un nouvelle configuration et Factory à chaque appel? Je suppose que ce n'est que le début du code et que tu corrigera par la suite


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @PersistenceContext (unitName = "MySqlConnPoll")
    	private EntityManager em;
     
    	private static SessionFactory sessionFactory;
    Tu mélange EntityManager et gestion toi même de la factory hibernate. Pourquoi ce mélange? Tiens toi à une architecture. Soit JPA avec son entitymanager, soit hibernate avec sa session factory.

    Pourrais-tu au minimum corriger le code comme ceci et nous dire ce qui en sort?

    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
    	private Session getSession() throw HibernateException
    	sessionFactory = new Configuration().configure("com\\xml\\hibernate.cfg.xml").buildSessionFactory();
    	return sessionFactory.openSession();
    	}
     
    	public void insert_question(String question) throws HibernateException
    	{
    			Session session = getSession();
    			session.beginTransaction();
     
    			Nodes node = new Nodes();
     
    			node.setQuestion(question);
    			session.save(node);
     
    			session.close();
    	}

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Hello !

    Déjà merci pour tes infos, c est super sympa de prendre ton temps

    Maintenant, l insertion ce fait correctement ^^

    Pour ce qui est de config de sessionFactory, j'ai fait en sorte qu'elle ne se créer une seul fois (je mettrais le code complet a la fin du message).

    Enfin en ce qui concerne le mélange "em" et "session factory", j'ai bien essayer de me passer de l entity manager dans la methode "select" mais je n arrive pas a avoir une collection de mon objet "Node".

    Voici ma dao

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    @Stateless 
    public class Node_dao 
    {	
    	@PersistenceContext (unitName = "MySqlConnPoll")
    	private EntityManager em;
     
    	private static SessionFactory sessionFactory;
     
    	static
    	{
    		try
    		{
    			sessionFactory = new Configuration().configure("com\\xml\\hibernate.cfg.xml").buildSessionFactory();
    		}
    		catch (HibernateException e)
    		{
    			e.printStackTrace();
    		}
     
    	}
     
    	private Session getSession() throws HibernateException
    	{
    		return sessionFactory.openSession();
    	}
     
    	public void insert_question(String question) throws HibernateException
    	{
    		try
    		{
    			Session session = getSession();
    			Transaction tx = session.beginTransaction();
     
    			Nodes node = new Nodes();
     
    			node.setQuestion(question);
    			session.saveOrUpdate(node);
    			tx.commit();
    			session.close();
    		}
    		catch (HibernateException e)
    		{
    			e.printStackTrace();
    		}
    	}
     
    	public void insert_result(String result) throws HibernateException
    	{
    		try
    		{
    			Session session = getSession();
    			Transaction tx = session.beginTransaction();
     
    			Nodes node = new Nodes();
     
    			node.setResult(result);
    			session.save(node);
    			tx.commit();
    			session.close();
    		}
    		catch (HibernateException e)
    		{
    			e.printStackTrace();
    		}
    	}
     
    	@SuppressWarnings("unchecked")
    	public Nodes select (HttpServletRequest request) throws Dao_exception
        {
            List <Nodes> nodeList = new ArrayList<Nodes>();
            nodeList = em.createQuery("SELECT n FROM Nodes n").getResultList();
     
            return nodeList.get(0);
        }
    }
    Merkii beaucoup

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    bon, déjà, selectionner tous les nodes pour ne retourner que le premier, c'est chercher les emmerdes et gaspiller le temps du SGDB. Si t'as 10.000 Nodes, tu va rapatrier 10.000 lignes, construire 10.000 objet et n'utiliser que le premier => ne retroune que le premier.

    Quand au select avec hibernate =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query query = getSession.query("from Nodes");
    query.setMaxResults(1);
    return query.list().get(0);

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Hello,

    Alors oui j'ai fait comme ça parce qu'apparemment il est préférable de "jouer" avec la collection que de faire sans cesse des appels a la bdd. Mais sa c était avant d insérer hibernate et ont dirais que ce n'est pas ton point de vue ^^. Je vais essayer de rectifier le tire.

    Mais bon, ont s écarte du sujet de base qui est maintenant résolu .

    Merci pour ton aide, encore une fois tu ma éclairer sur plusieurs points .

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Sauf que tu ne "joue" pas avec la collection. Si tu dois retourner 500 lignes, il faut les demander un une fois (collection) plutot que de faire 500 appels.

    Là tu demande N lignes pour ne retourner qu'une seule valeur. Autrement dit, tu as fait l'inverse de ce qu'il faut faire. Au lieu d'utiliser une collection pour réduire le nombre d'appel, tu as gardé le même nombre d'appel, mais augmenté considérablement le nombre de valeurs retournées à chaquefois .

    Au lieu de passer de 500 à 1 appel, tu es passé de 500 lignes à 250.000 lignes retournées.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Ok je vois ce que tu veut dire et effectivement c'est gênant

    Donc si j'ai bien compris, il serait préférable d'utiliser ta manière, c est a dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query = getSession.query("from Nodes");
    query.setMaxResults(1);
    return query.list().get(0);
    où tu prends le premier de la liste et ensuite utiliser left/right node pour poser d'autres question ?

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ha oui, je commence à comprendre ce que tu essaie de faire.

    Là c'est une balance à atteindre.
    Si en utilisant left/right tu sais que tu va d'office passer sur tous les éléments, alors il peut effectivement être intéressant de demander à Hibernate de charger tous les Nodes dans son cache. La question est de savoir si tu a vraiment besoin de tous les node ou seulement d'un sous-set. Parce que charger 500 nodes pour n'en lire que 2, ce serait dommage , charger 500.000 node pour en utiliser 2000, on approche du suicidaire point de vue mémoire

    Bref, c'est plus l'usage qu'il faut éventuellement revoir.

    Le mieux serait clairement, selon moi, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getSession.query("from Nodes where ....").uniqueResult();
    au passage, ça évite de tomber sur un node "au hasard"

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    Oui voila, désolé j'ai pas expliquer mon projet

    En fait, le but du jeu est une suite de question "suis je un homme?", ont réponds "oui" ou "non" et ont passe au nœud suivant avec une nouvelle question et ainsi de suite jusqu’à avoir une réponse. D'où prendre tout les nœuds au démarrage du programme . En fait j'essaie de recréer le jeu akinator même si je n'ai pas la prétention d'être a leur niveau (loin de la)

    Et c'est vrai qu'avoir 500.000 résultat est énorme, mais est-ce vraiment l objectif du projet ? clairement non même si je veut être au plus près de la réalité pour mes futurs projet qui eux seront réel. Pour être franc, ce projet est juste une manière de ne pas perdre la main et d'apprendre de nouvelle techno.

    Et pour ce qui est des nœuds au hasard, je pense pas que cela soit possible puisque c est une suite de question qui va découler sur une seul réponse avec bien évident des analyses coté serveur pour ne pas avoir de doublons.

    Si je suis ton résonnement, au lieu de prendre toutes les données, il serait plus intéressante de faire comme tu le propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getSession.query("from Nodes where ....").uniqueResult();
    Par exemple dans mon cas se serait quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getSession.query("select id_left_node from Nodes where question=?").uniqueResult();
    pour récupérer mon id_left_node qui va me permettre d'avoir accès à la question suivante avec ce coup ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getSession.query("select question from Nodes where id_left_node=?").uniqueResult();
    Mais dans ce cas, ne suis-je pas en train de perdre de la ressources en faisant a chaque question des aller/retour a la bdd? (d'autant plus que si j'ai bien compris ce qui faudrait faire, je vais avoir 2 appels a la bdd par question). Alors qu'actuellement, je fais juste appel une seul fois a la bdd au démarrage du jeu en prenant toute la base et c'est terminé

    merci

  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par biohazard401 Voir le message
    Oui voila, désolé j'ai pas expliquer mon projet

    En fait, le but du jeu est une suite de question "suis je un homme?", ont réponds "oui" ou "non" et ont passe au nœud suivant avec une nouvelle question et ainsi de suite jusqu’à avoir une réponse.
    Dans ce cas, tu va utiliser au total log(n) noeuds en moyenne, il n'est pas intéressant de tout pré-charger.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 15
    Points
    15
    Par défaut
    ok, donc tu préconise un aller retour a la bdd pour chaque question ?

    Mais lors d'un stage en entreprise, ont m'avait fait comprendre qu'il était plus que conseiller d'utiliser une collection avec les données de la bdd au lieu de faire appel a la bdd pour chaque requête (question de propreté et de sécurité).

    La si j'ai bien compris, tu me conseil des appels a chaque fois comme je te l'ai montré au dernier message ? c'est a dire d'aller a la pêche au id pour chaque question.

Discussions similaires

  1. Enregister une image avec Hibernate sans JavaBean
    Par SaladinDev dans le forum Hibernate
    Réponses: 3
    Dernier message: 22/12/2012, 18h54
  2. [Mapping] Tables créées avec Hibernate sans cascade
    Par nouraty dans le forum Hibernate
    Réponses: 3
    Dernier message: 21/08/2012, 09h20
  3. Pool de connection avec C3P0 sans hibernate
    Par peofofo dans le forum JDBC
    Réponses: 0
    Dernier message: 10/04/2012, 09h32
  4. Réponses: 5
    Dernier message: 10/03/2009, 18h03
  5. Table sans primary key avec Hibernate
    Par zizou771 dans le forum Hibernate
    Réponses: 1
    Dernier message: 28/02/2007, 15h58

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