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

JSF Java Discussion :

JSF et les Transactions hibernate


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut JSF et les Transactions hibernate
    Bonjour,

    Cela fait maintenant 2 jours que je commence à m'arracher les cheveux je viens donc solliciter votre aide. Je souhaiterai avoir quelques précisions sur les transactions d'hibernate (session.getTransaction()) avec JSF.
    Actuellement je suis confronté a deux problèmes et je ne vois pas trop comment les gérer.

    Le premier problème :
    Code associé (Bean):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public List getAllSeries() {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
     
            session.beginTransaction();
            Query q = session.createQuery ("from Serie as serie where serie.title LIKE '%" + this.search + "%'");
            List<Serie> tmp = (List<Serie>) q.list();
            session.getTransaction().commit();
            return tmp;
        }
    Classe Serie :
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    package Database;
     
    import java.util.Date;
    import java.util.Set;
     
    /**
     * Serie generated by hbm2java
     */
    public class Serie  implements java.io.Serializable {
     
         private Integer serieId;
         private ChannelSerie channelSerie;
         private StatusSerie statusSerie;
         private String title;
         private String description;
         private int format;
         private Date year;
     
        public Serie() {
        }
     
     
        public Serie(ChannelSerie channelSerie, StatusSerie statusSerie, int format, Date year) {
            this.channelSerie = channelSerie;
            this.statusSerie = statusSerie;
            this.format = format;
            this.year = year;
        }
     
        @Override
        public boolean equals(Object obj)
        {
            if (obj instanceof Serie)
                return this.hashCode() == obj.hashCode();
            return false;
        }
     
        @Override
        public int hashCode() {
            int hash = 7;
            hash = 59 * hash + (this.serieId != null ? this.serieId.hashCode() : 0);
            return hash;
        }                  total = 0;
     
        public Integer getSerieId() {
            return this.serieId;
        }
     
        public void setSerieId(Integer serieId) {
            this.serieId = serieId;
        }
        public ChannelSerie getChannelSerie() {
            return this.channelSerie;
        }
     
        public void setChannelSerie(ChannelSerie channelSerie) {
            this.channelSerie = channelSerie;
        }
        public StatusSerie getStatusSerie() {
            return this.statusSerie;
        }
     
        public void setStatusSerie(StatusSerie statusSerie) {
            this.statusSerie = statusSerie;
        }
        public String getTitle() {
            return this.title;
        }
     
        public void setTitle(String title) {
            this.title = title;
        }
        public String getDescription() {
            return this.description;
        }
     
        public void setDescription(String description) {
            this.description = description;
        }
        public int getFormat() {
            return this.format;
        }
     
        public void setFormat(int format) {
            this.format = format;
        }
        public Date getYear() {
            return this.year;
        }
     
        public void setYear(Date year) {
            this.year = year;
        } 
    }
    Code JSF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <x:dataTable
                    id="results"
                    value="#{searchBO.allSeries}"
                    var="serie">
    ....
    <h:outputText value="#{serie.channelSerie.title}"/>
    </x:dataTable>
    Erreure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    Probleme :
    Lorsque je veux accéder à une donnée d'un des fils de ma classe Serie dans un datable, hibernate lache une exception à cause du "lazy initialisation" vu que j'ai ferme la transaction. Si je ne ferme pas la transaction cela ne pose aucun probleme.
    Cependant le fait de ne pas fermer une transaction n'est pas vraiment propre et me pose le probleme suivant.


    Le deuxieme probleme :
    Je fais une requete pour recupere un utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Session     session = HibernateUtil.getSessionFactory().getCurrentSession();
     
                session.beginTransaction();
                Query q = session.createQuery("from Client as client where client.pseudo LIKE '" + client.getPseudo() + "' AND client.password LIKE '" + client.getPassword() + "'");
                Client tmp = (Client) q.uniqueResult();
    Seulement je ne peux pas fermer la transaction sinon je ne peux plus modifier le client.
    Sauf que lorsque que je souhaite sauvegarde des changements effectuer sur mon client cela pose un autre probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public String           cancelSerie()
        {
            Object              tmp = this.getTableSeries().getRowData();
            this.client.getClientSeries().remove(new ClientSerie(this.client, ((ClientSerie)tmp).getSerie()));
            Session     session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            session.saveOrUpdate(this.client);
            session.getTransaction().commit();
            return "persoGestion";
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
    En effet j'essaye d'acceder aux données de l'utilisateur via deux transactions ce qui pose un probleme, cependant je ne vois pas comment régler ces problèmes.

    Si quelqu'un pouvait m'aider à trouver une solution je lui serai tres reconnaissant.

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Par défaut
    Lorsque je veux accéder à une donnée d'un des fils de ma classe Serie dans un datable, hibernate lache une exception à cause du "lazy initialisation" vu que j'ai ferme la transaction. Si je ne ferme pas la transaction cela ne pose aucun probleme.
    Cependant le fait de ne pas fermer une transaction n'est pas vraiment propre et me pose le probleme suivant.
    Quelle est l'utilité d'ouvrir une transaction pour ne faire que de la lecture (select) ?

    La transaction n'est utile que sur ton appel saveOrUpdate. Avec un try/catch ca serait mieux, car tu ferais ton rollback dans le catch.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Désolé pour le temps de réponse et merci de ta réponse.

    Quelle est l'utilité d'ouvrir une transaction pour ne faire que de la lecture (select) ?
    Le problème vient du fait que si je n'ouvre pas de transaction je peux pas creer des requetes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.HibernateException: createQuery is not valid without active transaction

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Par défaut
    Bonjour Mobuho,

    Si je résume ton problème (pour être sûr de t'apporter la bonne solution), c'est que tu charges des données depuis la base dans une vue, qui sont en mode Lazy loading.

    Première question, tes données sont-elles volumineuses ? Est-il nécessaire qu'elles soient en "Lazy loading" ? Ne souhaites-tu pas qu'elles soient chargées directement ?

    Si tu tiens tout de même à garder ton mode de chargement "Lazy loading" voici deux liens te permettant de comprendre un peu mieux le fonctionnement d'Hibernate.

    premier lien

    deuxième lien

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Bonjour Mobuho,

    Si je résume ton problème (pour être sûr de t'apporter la bonne solution), c'est que tu charges des données depuis la base dans une vue, qui sont en mode Lazy loading.

    Première question, tes données sont-elles volumineuses ? Est-il nécessaire qu'elles soient en "Lazy loading" ? Ne souhaites-tu pas qu'elles soient chargées directement ?

    Si tu tiens tout de même à garder ton mode de chargement "Lazy loading" voici deux liens te permettant de comprendre un peu mieux le fonctionnement d'Hibernate.
    Merci énormement, c'est exactement ca mon problème, après lecture des deux liens je crois avoir trouvé ma solution.
    Je vous tiens au courant et je passerai le post en "résolu" des que ca marche.

    Merci encore.

    C'est bon j'ai reussi a résoudre mon problème, merci N4rc0.

    PS : Pour les gens que ca pourrait intéressé le moyen de "simuler" le lazy="false" : Hibernate.initialize(Object obj);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les types de transactions Hibernate
    Par ghir_ana dans le forum Hibernate
    Réponses: 0
    Dernier message: 03/05/2015, 15h15
  2. [Hibernate2] Hibernate et les transactions
    Par didate dans le forum Hibernate
    Réponses: 8
    Dernier message: 11/08/2014, 12h19
  3. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  4. les Transactions sous interbase
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/10/2004, 11h15
  5. [interbase] gerer les transactions
    Par webbulls dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/05/2004, 18h27

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