[ALG3ir] TD5 + Hibernate

Voir le sujet précédent Voir le sujet suivant Aller en bas

[ALG3ir] TD5 + Hibernate

Message  dahico2002 le Sam 19 Déc 2009, 00:21

Bonjour tout le monde,

au niveau d'Hibernate, mon soucis réside au niveau de l'insertion d'un nouveau mot au sein de la base de données. Je sais qu'il faut taper le code suivant pour insérer un nouvel objet
Code:
session.save(objet);
.

Mais lorsque je regarde au niveau de la base de données, il n'a pas insérer le mot.

Donc je ne sais pas si il faut modifier des choses au niveau des fichiers xml des classes ou il faut taper une commande spéciale HQL dont je ne connais pas ??

Merci pour vos réponses

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  pbt le Sam 19 Déc 2009, 11:05

C'est effectivement quelque chose du genre (pas de HQL) ...

Sans infos complémentaires, je ne peux pas t'aider ... fais peut-être un test simple (dans une classe neuve) afin de récupérer ta session et d'insérer un objet dans ta BD.

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  dahico2002 le Dim 20 Déc 2009, 15:07

J'ai essayé ce qu'il y avait sur le lien avec une seul table sans clé étrangère, et cela marche bien. Mais lorsque je reprends les 3 tables du TD5, j'ai ecrit ceci dans le 'Main.java' :
Code:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package test1;

import java.io.Serializable;
import java.util.*;
import org.hibernate.Session;

/**
 *
 * @author Malick
 */
public class Main {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        Session s=Util.getSessionFactory().openSession();
        s.beginTransaction();

        Word w=new Word();
        w.setWordid(0);
        w.setWordtxt("mot");
        w.setWordanagram("otm");
        w.setWordlangs(new HashSet(0));

        //Serializable wId=s.save(w);
        http://s.getTransaction().commit();
        http://s.beginTransaction();
        //Long id=(Long)s.save(w);

        Wordlang wl=new Wordlang();
        wl.setId(new WordlangId(w.getWordid(),1));
        wl.setLanguage((Language)s.load(Language.class, 1));
        wl.setWord(w);
        wl.setWlnbplay(0);
        wl.setWlnbloss(0);
        wl.setWlnbstop(0);
        wl.setWlnbwin(0);

        s.save(wl);

        s.getTransaction().commit();
    }

}

et j'ai eut ces erreurs ceci :
Code:

20-déc.-2009 15:03:26 org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured
Hibernate: select word_.WORDID, word_.WORDTXT as WORDTXT2_, word_.WORDANAGRAM as WORDANAG3_2_ from ROOT.WORD word_ where word_.WORDID=?
Hibernate: insert into ROOT.WORDLANG (wlwordid, wllangid, WLNBPLAY, WLNBWIN, WLNBLOSS, WLNBSTOP, WLWORDID, WLLANGID) values (?, ?, ?, ?, ?, ?, ?, ?)
20-déc.-2009 15:03:26 org.hibernate.util.JDBCExceptionReporter logExceptions
ATTENTION: SQL Error: -1, SQLState: 42X13
20-déc.-2009 15:03:26 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Le nom de colonne 'WLWORDID' figure plusieurs fois dans la liste des colonnes d'une instruction INSERT.
20-déc.-2009 15:03:26 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
GRAVE: Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: could not insert: [test1.Wordlang]
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at test1.Main.main(Main.java:47)
Caused by: java.sql.SQLSyntaxErrorException: Le nom de colonne 'WLWORDID' figure plusieurs fois dans la liste des colonnes d'une instruction INSERT.
        at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
        at org.apache.derby.client.am.Connection.prepareStatement(Unknown Source)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
        at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94)
        at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
        at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
        ... 11 more
Caused by: org.apache.derby.client.am.SqlException: Le nom de colonne 'WLWORDID' figure plusieurs fois dans la liste des colonnes d'une instruction INSERT.
        at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source)
        at org.apache.derby.client.net.NetStatementReply.parsePrepareError(Unknown Source)
        at org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(Unknown Source)
        at org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown Source)
        at org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown Source)
        at org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown Source)
        at org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.prepare(Unknown Source)
        at org.apache.derby.client.am.Connection.prepareStatementX(Unknown Source)
        ... 17 more
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [test1.Wordlang]
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at test1.Main.main(Main.java:47)
Caused by: java.sql.SQLSyntaxErrorException: Le nom de colonne 'WLWORDID' figure plusieurs fois dans la liste des colonnes d'une instruction INSERT.
        at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
        at org.apache.derby.client.am.Connection.prepareStatement(Unknown Source)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
        at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94)
        at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
        at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
        ... 11 more
Caused by: org.apache.derby.client.am.SqlException: Le nom de colonne 'WLWORDID' figure plusieurs fois dans la liste des colonnes d'une instruction INSERT.
        at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source)
        at org.apache.derby.client.net.NetStatementReply.parsePrepareError(Unknown Source)
        at org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(Unknown Source)
        at org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown Source)
        at org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown Source)
        at org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown Source)
        at org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.prepare(Unknown Source)
        at org.apache.derby.client.am.Connection.prepareStatementX(Unknown Source)
        ... 17 more
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

Je sais qu'il faut insérer un mot avant d'insérer le "Wordlang" qu'il faut. Mais cela ne fonctionne pas et je ne comprends pas comment cela fonctionne.

Merci pour vos réponses

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  pbt le Dim 20 Déc 2009, 16:14

Tu as deux fois "WLWORDID" et "WLLANGID" dans l'insert généré par Hibernate ... est-ce normal ?

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  aro le Lun 21 Déc 2009, 11:42

dahico2002 a écrit:Merci pour vos réponses
D’abord qq questions :
1) A quoi sert la collection wordlangs dans Word ? Pas besoin de récupérer la liste de Worlangs à partir d’un Word => ?
2) Comme il n’y a pas de s.save(w), je suppose que le mot avec la clé primaire 0 a déjà été ajouté dans la db. Correct ?
3) A quoi sert tout ce code ? Pourquoi ne pas laisser Hibernate se débrouiller ? En gros, et en supposant que le mot avec la clé primaire 0 a déjà été ajouté dans la db, tout ce qu’il y a entre le début de la transaction et le commit peut être résumé par :

Code:
  s.beginTransaction();
  Wordlang wl=new Wordlang();
  wl.setId(new WordlangId(0,1));
  s.save(wl);
  s.getTransaction().commit();
Ceci dit, je ne vois rien dans le code qui empêcherait la création d’un Wordlang SI les fichiers de mapping (et les classes correspondantes) sont corrects. C’est donc plutôt de ce côté là qu’il faudrait chercher.

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  dahico2002 le Mar 22 Déc 2009, 12:41

Effectivement, le problème se situais dans les fichiers mapping. J'ai su résoudre mon problème.

Mais il y en a un autre qui s'est glissé. Mon problème est que lorsqu'on ajoute un nouveau mot à la base de donnée, je fais de tel sorte que je connaisse la valeur du id du nouveau mot. Mais comment est-ce qu'on fait pour assigner cette valeur à la méthode "session.save()" ?

Je crois que cela vient du faite que dans les fichiers mapping, plus particulièrement
<generator class="assigned" />
:
Code:

 <hibernate-mapping>
    <class name="test.Word" table="WORD" schema="APP">
        <id name="wordid" type="int">
            <column name="WORDID" />
            <generator class="assigned" />
        </id>
...

Merci encore

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  aro le Mar 22 Déc 2009, 14:10

dahico2002 a écrit:Mon problème est que lorsqu'on ajoute un nouveau mot à la base de donnée, je fais de tel sorte que je connaisse la valeur du id du nouveau mot. Mais comment est-ce qu'on fait pour assigner cette valeur à la méthode "session.save()" ?
Pour ajouter un nouveau mot à la base de donnée, il suffit d’appeler save avec comme argument une instance de la classe Word => un truc du style :
session.save(new Word(wordId, wordTxt, wordAnagram))
dahico2002 a écrit:Je crois que cela vient du faite que dans les fichiers mapping, plus particulièrement <generator class="assigned" />
<generator class="assigned" /> signale tout simplement que la clé primaire est assignée et pas générée automatiquement lors d’une insertion (sinon, c’est native à la place de assigned mais il faut bien sur que l’auto incrément soit demandé dans la db)

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  dahico2002 le Mer 23 Déc 2009, 11:13

Lorsque je teste cela, le programme insère un mot avec un identifiant égal à 0, hors que je ne veux pas cela. Je voudrais qu'il ait un identifiant qui suit la logique de la base de donnée.

Lorsqu'on créée une instance de "Word", et qu'on lui donne un identifiant égal au suivant du dernier mot se trouvant dans la base de données, je voudrais que lorsque
session.save(new Word(50,'test','tets'));
, son identifiant dans la DB soit le numéro 50 ?

Je ne sais pas si cela est possible, ou bien il faut vider complètement la base de données et le problème est réglé.

Merci

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  pbt le Mer 23 Déc 2009, 11:25

Pourquoi ne veux-tu pas laisser à la BD le soin d'attribuer un identifiant unique à ton "Mot" ?

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  dahico2002 le Mer 23 Déc 2009, 11:44

Je viens de tester avec un mot sans redéfinir son id et dans la base de données, mon mot que j'ai ajouté à son id à 0.

Mais moi je veux qu'il ait la suite des numéros de la base de données.

Je ne sais pas quoi faire dans ce cas là

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  pbt le Mer 23 Déc 2009, 11:53

... et ton id est bien en "auto increment" ?

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  dahico2002 le Mer 23 Déc 2009, 12:14

vous voulez dire dans la base de donnée ou dans les fichiers mapping ?

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  aro le Mer 23 Déc 2009, 13:07

dahico2002 a écrit:Lorsqu'on créée une instance de "Word", et qu'on lui donne un identifiant égal au suivant du dernier mot se trouvant dans la base de données, je voudrais que lorsque
session.save(new Word(50,'test','tets'));
, son identifiant dans la DB soit le numéro 50 ?

Je ne sais pas si cela est possible, ou bien il faut vider complètement la base de données et le problème est réglé.

Merci
Vider la base de données est assez radical ;-) Et, à condition qu'il n'y ait pas déjà un mot avec l'id 50, il ne devrait pas y avoir de problèmes.
Comment as-tu fait pour le td4 ? C’est exactement le même principe :
- soit l’autoincrément est demandé dans la base de donnée
- soit il faut le gérer soi-même (ce sera parfois la seule option, par exemple avec Oracle)
Pour le gérer soi-même, le plus simple consiste à utiliser la fonction d’agrégation MAX pour récupérer le plus grand id des mots et y ajouter 1 pour avoir un nouvel id. En pratique, il s’agit d’une commande SQL avec JDBC (td4) et d’une commande HQL avec Hibernate (td5).
Avec Hibernate, ce nouvel id obtenu sera donné comme valeur pour l’attribut correspondant de l’instance de la classe Word utilisée lors du save.

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  Wark le Mer 23 Déc 2009, 13:12

MySQL peut très bien faire l'auto-incrément mon cher Malik. santa

Aucun souci avec ça chez moi en tout cas..

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  dahico2002 le Jeu 24 Déc 2009, 11:13

Ben voilà, j'ai recréer les tables sur MySQL et j'ai insérer le faite que l'identifiant soit auto incrémenté. Maintenant tout marche bien.

Merci pour votre aide (pas essayer la 2ème solution proposé plus haut)

Bonne Noël à toutes et à tous santa

dahico2002

Nombre de messages : 62
Age : 32
Prénom : Malick
Date d'inscription : 13/12/2006

Revenir en haut Aller en bas

Re: [ALG3ir] TD5 + Hibernate

Message  Contenu sponsorisé Aujourd'hui à 20:42


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum