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 :

Recuperer la valeur d'une sequence


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 84
    Par défaut Recuperer la valeur d'une sequence
    Bonjour,

    Je cherche a récupérer une valeur unique. J'ai donc créé en base, une séquence.

    Le problème est pour récupérer cette valeur. J'aimerai continuer à passer par hibernate pour ce qui est de laccès à la base de données et ne pas utiliser de JDBC directement (Est ce une bonne méthode?).

    Pour l'instant j'ai une méthode qui fonctionne mais que j'aimerai éviter car je la trouve pas propre du tout (Ai je raison?).

    Avec le mapping suivant je crée un objet que je sauvegarde (session.save()) puis je rollback ma transaction. J'obtient ainsi le numéro de la session. Si je commite de nombreuses erreurs apparaissent car hibernate essait de me persister cette valeur dans la classe sequenceDTO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 28 ao?t 2007 11:27:18 by Hibernate Tools 3.2.0.b9 -->
    <hibernate-mapping>
        <class name="XXX.dto.SequenceDTO" schema="public">
            <id name="id" type="long">
                   <generator class="sequence" >
                	        <param name="sequence">seq</param>
                   </generator>
            </id> 
        </class>
    </hibernate-mapping>
    Existe t il une "bonne" méthode pour récupérer la valeur d'une séquence?

    Merci par avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String nextSequenceQuery = "select taSequence.nextval from dual";
    SQLQuery sqlQuery = session.createSQLQuery(nextSequenceQuery);
    BigDecimal id = (BigDecimal) sqlQuery.uniqueResult();
    Voilà comment récupérer la prochaine valeur de ta séquence.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 84
    Par défaut
    Je voulai justement éviter le SQL (pb de deux bases).

    Existe t il une possibilité de l'exécuter en HQL?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Quel est ton problème avec cette méthode ?

    Je t'ai proposé une solution en utilisant Hibernate.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 84
    Par défaut
    Les séquences sont implémentés différement dans les bases de données.
    Ex:
    - Oracle seq.nextval()
    - Postgres: nextval(seq)

    Je veux donc utiliser le HQL pour que les appels soit génériques entres bases.

    La méthode du mapping de table inexistante (hibernate pense que la table sequenceDTO existe) présenté dans mon premier message fonctionne bien mais me parait très peu élégante.

    Le HQL me parait adécquate mais je doit mal l'utiliser.

    Merci de tes réponses.

    Arnaud

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Ok, je comprends.
    Je ne sais donc pas comment faire autrement.

    Ceci dit, le jour où tu utiliseras une base qui ne supporte pas les séquences, tu seras bien embêté.

  7. #7
    Membre chevronné Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Par défaut
    salut ^^
    Regarde l'API criteria.
    Elle te permet de faire des requetes sans avoir a taper une ligen de sql...
    Par exemple : tu veux rechercher tous les gens qui s'apelle René (Prénom a la mode d'ailleurs !).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DetachedCriteria criteria = DetachedCriteria.forClass("Person").add(Restrictions.eq("prenom","rené");
    List<person> result = getHibernateTemplate().findByCriteria(criteria);
    Tu peux tout faire via cette API. Perso, je n'utilise plus que ca ^^

    Citation Envoyé par fr1man Voir le message
    Ceci dit, le jour où tu utiliseras une base qui ne supporte pas les séquences, tu seras bien embêté.
    Ca c'est clair ! Et puisque apparemment tu auras a utiliser plusieurs, vérifie bien qu'elle accepte bien le type sequence. Sinon passe à autre chose

  8. #8
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 29
    Par défaut problème de cast:
    Citation Envoyé par fr1man Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String nextSequenceQuery = "select taSequence.nextval from dual";
    SQLQuery sqlQuery = session.createSQLQuery(nextSequenceQuery);
    BigDecimal id = (BigDecimal) sqlQuery.uniqueResult();
    Voilà comment récupérer la prochaine valeur de ta séquence.
    Bonjour, j'ai un problème quand je veux récupérer la nextval de ma séquence:
    j'ai le message suivant:
    [31/10/08 10:05:43:982 GMT] 66092e79 SystemErr R java.lang.ClassCastException: java.lang.Object
    voici mon code :BigDecimal seq;

    SQLQuery nextSequenceQuery = session.createSQLQuery("select OC_SEQ.nextval from dual") ;
    seq = (BigDecimal)nextSequenceQuery.uniqueResult() ;
    fin code.
    en faite j'ai même utiliser Integer à la place de BigDecimal mais toujours je suis gratifié par le même message

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Par défaut
    T'as essayé avec Long ?

Discussions similaires

  1. Récupérer les valeurs d'une GtkComboBox
    Par portos.lio dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 01/12/2005, 13h32
  2. Recuperer les valeurs d'une requette [C#]
    Par AlphonseBrown dans le forum C#
    Réponses: 7
    Dernier message: 22/11/2005, 16h36
  3. [VB.NET] Recuperer la valeur d'une cellule d'un DataTable
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/03/2005, 10h59
  4. recuperer la valeur d une cellule
    Par Invité(e) dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/01/2005, 18h05
  5. [C#] Recuperation de valeur dans une autre page
    Par kenzo080 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 02/06/2004, 10h32

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