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 session object


Sujet :

Hibernate Java

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Hibernate session object
    Bonjour,

    J'essaye de mettre en place hibernate mais j'ai des problèmes.

    J'ai actuellement deux classes, Configuration et Application.
    Dans ma classe Application j'ai une liste de Configuration.

    Lorsque j'insert une Application ou une Configuration ça marche et l'update aussi, par contre lorsque je souhaite supprimer une application je veux que la liste de configuration soit supprimer.

    Mais j'obtiens l'erreur suivante :
    a different object with the same identifier value was already associated with the session: [ApplicationBO#3]
    Je comprend l'erreur mais je n'ai aucune idée de comment y remédier.


    HibernateUtil
    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
     
    package fr.service;
     
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
     
    public class HibernateUtil {
     
        private static final SessionFactory sessionFactory = buildSessionFactory();
     
        private static SessionFactory buildSessionFactory() {
            try {
                return new Configuration().configure("hibernate-meteo.cfg.xml").buildSessionFactory();
            } catch (Throwable ex) {
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
     
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
     
     
        public static void shutdown() {
            getSessionFactory().close();
        }
    }
    Requêtes
    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
     
        public List<?> getListObject(String className, Session se) {
            List<?> l = null;
            se.beginTransaction();
            try {
                Query q = se.createQuery("from " + className);
                l = q.list();
            } catch (HibernateException he) {
                throw he;
            } catch (RuntimeException ex) {
                throw ex;
            }
     
            return l;
        }
     
        public void deleteObject(Object o, Session se) {
            Transaction tx = se.beginTransaction();
            try {
                se.delete(o);
                tx.commit();
            } catch (Exception ex) {
                tx.rollback();
                ex.printStackTrace();
            } 
        }
     
    public boolean saveObject(Object objet, Session se) throws StaleStateException {
            boolean result = false;
            Transaction tx = null;
            try {
     
                tx = se.beginTransaction();
                se.saveOrUpdate(objet);
                tx.commit();
                result = true;
            } catch (StaleStateException sse) {
                sse.printStackTrace();
                tx.rollback();
                se.clear();
                throw sse;
            } catch (HibernateException he) {
                tx.rollback();
                throw he;
            }
    Application
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping auto-import="true">
    	<class lazy="false"
    		name="ApplicationBO" table="application">
    		<id name="id" column="id">
    			<generator class="increment" />
    		</id>
    		<property name="libelle" column="libelle" type="string" />
    		<property name="etat" column="etat" type="boolean" />
     
    		<list name="lstConfApp" cascade="all" inverse="true">
    			<key column="idApplication" />
    			<list-index column="id" />
    			<one-to-many class="ConfigurationApplicationBO" />
    		</list>
    	</class>
    </hibernate-mapping>
    Configuration
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping auto-import="true">
    	<class lazy="false"
    		name="ConfigurationApplicationBO"
    		table="configurationapplication">
    		<id name="id" column="id">
    			<generator class="increment" />
    		</id>
    		<property name="hostID" column="host_object_id" type="int" />
    		<property name="serviceID" column="service_object_id" type="int" />
    		<property name="etat" column="etat" type="boolean" />
    		<property name="libelle" column="libelle" type="text" />
     
    		<many-to-one name="Application" column="idApplication" cascade="all" />
    	</class>
    </hibernate-mapping>

  2. #2
    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
    Tu peux montrer le code amenant l'erreur et pas tes classes utilitaires sans savoir comment tu les utilise?


    Ton erreur indique que tu a tenté de mettre dans ta session hibernate, via probablement un save, un object Application avec l'ID 3 mais qu'il existait déjà un tel objet dans la session, ce qui est un erreur, chaque entité doit être unique dans une session.

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Je récupère via un formulaire WEB les infos de l'application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ApplicationBOapp = new ApplicationBO()
     
    app.setId(Integer.valueOf(id[i]));
    app.setLibelle(request.getParameter("nomApp" + id[i]));
    app.setEtat(request.getParameter("etatApp" + String.valueOf(id[i])) != null ? true : false);
     
    ContextServiceImpl.getInstance().deleteObject(app, HibernateUtil.getSessionFactory().getCurrentSession());

  4. #4
    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
    oui mais non, tu ne peux pas constuire ton objet comme ça.


    Tu dois faire un session.find de l'objet pour faire un delete de cet objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.delete(session.find(ApplicationBO.class,Integer.valueOf(id[i]))

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <generator class="increment" />
    Fait aussi attention avec l'utilisation du generator increment: https://docs.jboss.org/hibernate/orm...declaration-id

    A+.

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Effectivement cela marche mieux. Merci.

    Du coups quand je veux faire un update, d'un élément je le récupère avec un find et je lui modifie les propriétés. ?

    J'ai également vu qu'il existait les méthodes suivante load() et get(). La tu me montre la méthode find() qu'apporte t-elle de plus de moins que les précédentes. Fait-elle juste une requête à la base pour récupérer mon élément ?

    J'ai vu cet article pour get() et load().

  7. #7
    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
    Je pensais à get(). find() c'est son équivalent en jpa

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

Discussions similaires

  1. [Hibernate]session.save ne marche pas au sein d'un loop
    Par ouafaa dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/07/2006, 16h05
  2. [Hibernate] Session Factory ThreadSafe
    Par K-Kaï dans le forum Hibernate
    Réponses: 6
    Dernier message: 03/07/2006, 10h55
  3. [Hibernate] Session & Objets persistants
    Par Gob4 dans le forum Hibernate
    Réponses: 3
    Dernier message: 22/05/2006, 14h13
  4. Réponses: 40
    Dernier message: 13/05/2006, 00h04
  5. [Cookies] Session object destruction failed
    Par Paganoni dans le forum Langage
    Réponses: 2
    Dernier message: 11/01/2006, 09h38

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