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 :

Insert OK mais Delete KO ?


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut Insert OK mais Delete KO ?
    Bonjour,

    Je suis en Hibernate/Spring et je tente d'exécuter la classe de test suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        protected UserDAO userDAO; // Injection Spring
        public void testUser(){
            //1. Insert puis delete sur le même objet
            User a = userDAO.newUser("a");
            userDAO.deleteUser(a);
            System.out.println("---");
     
            //2. Delete un objet qui existe déjà
            User user = userDAO.getUserWithName("JUnit");
            assertNotNull(user);
            userDAO.deleteUser(user);
        }
    Cela a pour effet d'afficher ceci dans la console, logs hibernate sql activés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Hibernate: insert into t_User (c_name, c_version) values (?, ?)
    ---
    Hibernate: delete from t_User where c_id=?
    Hibernate: select this_.c_id as c1_22_0_, this_.c_name as c2_22_0_, this_.c_version as c3_22_0_ from t_User this_ where this_.c_name=?
    Mon soucis est le suivant : alors que la première partie du code s'execute sans aucun problème (insert du user "a", puis delete), mon second delete ne fonctionne pas, je ne comprend pas pourquoi...

    Pour info, voici la calsse userDAO :

    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 class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
     
        public User newUser(String name){        
            User user = new User();
            user.setName(name);
            getHibernateTemplate().save(user);
            return user;
        }
     
        public void deleteUser(User user){
            getHibernateTemplate().delete(user);
        }
     
        public User getUserWithName(String name) {
            Criteria criteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(User.class);
            return (User) criteria.add(Restrictions.eq("name", name)).uniqueResult();
        }
     
    }
    Quelqu'un aurait-il un idée expliquant cela?

    A toutes fin utiles, le code du POJO et du hbm.xml se trouve ici
    http://www.developpez.net/forums/sho...d.php?t=462235

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    As tu un message d'erreur ?

    ou simplement le delete ne s'effectue pas ?

    Si tu fais un assert false; après ton seconde delete, que se passe-t-il ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Non, je n'ai pas de message d'erreur, le delete ne se fait tout simplement pas.

    Ah tiens, c'est très étonnant, l'assert(false) ne fait pas échouer le test...???

  4. #4
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par Asterius Voir le message
    Non, je n'ai pas de message d'erreur, le delete ne se fait tout simplement pas.

    Ah tiens, c'est très étonnant, l'assert(false) ne fait pas échouer le test...???
    Ca veut dire qu'une exception est lancée pendant ton delete et qu'il n'effectue pas correctement cette derniere instruction

    Ajoute un try catch(Exception e) sur ton dernier delete et effectue un e.printStackTrace();

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Non, je ne récupère pas d'exception.
    Mais ça reste très bizarre, on dirait qu'il passe le assert sans se tracasser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            User user = userLogic.getUserWithName("JUnit");
            System.out.println(user);
            try{
            userLogic.delete(user);
            } catch (Exception e){
                e.printStackTrace();
            }
     
            assert(false);
            System.out.println("XXX");

    J'ai dans la console (et le test me dit qu'il a réussi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ATTENTION: No bean with name 'transactionStatus'
    21 déc. 2007 12:12:24 org.springframework.jdbc.datasource.JdbcTransactionObjectSupport <clinit>
    INFO: JDBC 3.0 Savepoint class is available
    21 déc. 2007 12:12:24 org.springframework.test.AbstractTransactionalSpringContextTests startNewTransaction
    INFO: Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@38a763]; default rollback = true
    Hibernate: select this_.c_id as c1_22_0_, this_.c_name as c2_22_0_, this_.c_version as c3_22_0_ from t_User this_ where this_.c_name=?
    User[name:JUnit; id:1]
    XXX
    21 déc. 2007 12:12:24 org.springframework.test.AbstractTransactionalSpringContextTests endTransaction
    INFO: Rolled back transaction after test execution

  6. #6
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    et si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     try{   
    User user = userLogic.getUserWithName("JUnit");
            System.out.println(user);
     
            userLogic.delete(user);
            } catch (Exception e){
    assert false : e.getMessage();
                e.printStackTrace();
            }
     
            assert(false);
            System.out.println("XXX");
    que se passe-t-il ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 953
    Points : 4 379
    Points
    4 379
    Par défaut
    Citation Envoyé par Asterius Voir le message
    INFO: Rolled back transaction after test execution
    [/CODE]
    ça dit bien ce que cela veut dire, non ?

    la transaction est "rolled back", donc le delete n'est pas "commited"...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    willoi : Ca ne fait rien non plus, j'ai le même output dans ma console

    JeitEmgie : Oui, j'ai effectivement mis plus de logs car je me disais aussi
    que ça aiderait à resoudre le problème. Cela dit :
    - Pourquoi la transaction fait-elle un rollback plutôt qu'un commit?
    - Pourquoi le delete fonctionne si je récupère le user "a", obtenu par la méthode newUser?
    - Et pourquoi newUser ne fait pas alors aussi un rollback?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    J'ai trouvé : il suffit d'ajouter dans le constructeur du test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setDefaultRollback(false);
    Merci pour votre aide!

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

Discussions similaires

  1. Pb Update datagrid mais delete ok
    Par Gerard_M54 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/04/2008, 14h10
  2. [MySQL] Une insertion MySql mais pas deux
    Par francoisch dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/10/2007, 18h23
  3. [PDO] Problème lors d'un INSERT ou un DELETE
    Par WerKa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/06/2007, 15h19
  4. [trigger] insert update et delete
    Par kooljy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/07/2006, 08h56
  5. [Debutant]Insertion nulle mais '' dans la base
    Par Tchinkatchuk dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 18/04/2005, 09h58

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