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 :

save() suivi de get() sur un objet fonctionne mais rien dans ma DB !


Sujet :

Hibernate Java

  1. #1
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut save() suivi de get() sur un objet fonctionne mais rien dans ma DB !
    Bonjour,

    dans un petit programme de test, je crée un objet que je rends persistant grâce à un save().La récupération de cet objet grâce à sa clé primaire et la commande get() me renvoie le bonne objet.

    Le probléme est que l'insertion n'est pas effectuée sur ma base MySQL !

    log4j:WARN No appenders could be found for logger (org.springframework.util.ClassUtils).
    log4j:WARN Please initialize the log4j system properly.

    Hibernate: insert into CLIENT (NOM, PRENOM, CODE_CLIENT) values (?, ?, ?)
    Hibernate: select client0_.CODE_CLIENT as CODE1_0_0_, client0_.NOM as NOM0_0_, client0_.PRENOM as PRENOM0_0_ from CLIENT client0_ where client0_.CODE_CLIENT=?

    Code de la classe :
    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
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    import com.securitoo.webservices.model.*;
    import com.securitoo.webservices.dao.*;
     
    public class ClientDAOHibernate extends HibernateDaoSupport implements ClientDAO {
     
    	public Client getClient(String id) {
    		return (Client) getHibernateTemplate().get(Client.class, id);
    	}
     
     
    	public void save(Client transientInstance) {
    		try {
    			getHibernateTemplate().save(transientInstance);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    Est ce une histoire de transaction ?
    J'ai besoin de votre aide !

    Merci d'avance !

  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
    Tu es sur qu'une excepton n'est pas levee dans ta methode save et que ta methode getClient retourne bien un Client non null?

  3. #3
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    Oui j'ai bien vérifié, aucune exception n'est levée !

    Code concernant la création et la récupération de l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ClientEntreprise ce = new ClientEntreprise(new ClientDB("pjpoj", "De Troy", "Lanfeust"));
    cm.saveEntrepriseClient(ce);// Fonction qui va appeler la fonction save du ClientDAO
     
    if(cm.getClient("pjpoj") == null)
    	System.out.println("L'ajout n'a pas fonctionné !");
    else
    	System.out.println("J'ai retrouvé "+cm.getClient("pjpoj").getNom());
    Log :
    Hibernate: insert into CLIENT (NOM, PRENOM, CODE_CLIENT) values (?, ?, ?)
    Hibernate: select clientdb0_.CODE_CLIENT as CODE1_0_0_, clientdb0_.NOM as NOM0_0_, clientdb0_.PRENOM as PRENOM0_0_ from CLIENT clientdb0_ where clientdb0_.CODE_CLIENT=?
    Hibernate: select clientdb0_.CODE_CLIENT as CODE1_0_0_, clientdb0_.NOM as NOM0_0_, clientdb0_.PRENOM as PRENOM0_0_ from CLIENT clientdb0_ where clientdb0_.CODE_CLIENT=?
    J'ai retrouvé De Troy


    EDIT 1 : j'ai renommé ma class Client en ClientDB entre temps !
    EDIT 2 : si j'ajoute manuellement un CLIENT dans ma base, j'arrive à le récupérer avec get ...

  4. #4
    Membre actif Avatar de coco62
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 237
    Points : 278
    Points
    278
    Par défaut
    As tu commiter sa session hibernate ?
    La persistence réelle peux être décalé si hibernate utilise son cache.

  5. #5
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Effectivement là je pense qu'il s'agit d'un problème de flush/commit ...

  6. #6
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    J'ai trouvé, c'est bien un problème de transaction.

    Les requêtes passent bien dans les logs MySQL

    Je suis passé de InnoDB à MyISAM.
    L'écriture sur la base est bien prise en compte.

    L'erreur vient donc bien du commiter.
    Je vais regarder les options possibles ...

    Merci beaucoup !

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je ne suis peut-être pas au gout du jour mais il me semblait que InnoDB gérait les transactions contrairement à MyISAM.
    Ce n'est plus le cas ? MyISAM les gère aussi ?

  8. #8
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par fr1man
    Je ne suis peut-être pas au gout du jour mais il me semblait que InnoDB gérait les transactions contrairement à MyISAM.
    Ce n'est plus le cas ? MyISAM les gère aussi ?
    InnoDB gère bien les transaction contrairement à MyISAM.

    En fait, j'ai vu que mon problème venait de la config d'Hibernate concernant les transactions, en passant ma table à MyISAM qui lui ne les gère pas.
    Comme MyISAM ne gère pas les transactions, il m'a directement écrit les modifs en base.

    Il me manquait :
    <property name="hibernate.connection.autocommit">true</property>
    dans mon fichier de config Hibernate pour fonctionner avec InnoDB.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Il est déconseillé de mettre la valeur de cette propriété à true, dixit la doc.

    J'utilise aussi mysql avec InnoDB et je n'ai pas de problème.

    Est-ce que tes transactions sont bien commitées ?

  10. #10
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    Non, mes transactions ne sont pas commitées (dans le code) car je voulais juste essayer de rendre persistant un objet.

    Par la suite, je vais enlever le 'auto-commit' et essayer d'utiliser les transactions au niveau métier :
    http://zekey.developpez.com/articles/spring/#LVII

    D'aprés ce que j'ai cru comprendre, je n'aurais plus besoin de "commiter" dans le code grâce à la définition de proxy vers le service métier avec support des transactions (un peu barbare cette phrase ).

    Mais bon, j'en suis pas encore la ...

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ok, je comprends mieux.
    Pas de problème avec spring pour les transactions.
    Ca marche très bien et ca simplifie le code.

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

Discussions similaires

  1. Script ne fonctionnant pas sur deux objets
    Par fufu7334 dans le forum Unity
    Réponses: 10
    Dernier message: 19/01/2014, 01h17
  2. Le clic sur un objet HTML ne fonctionne pas
    Par womannosky dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 10/03/2010, 11h19
  3. Réponses: 2
    Dernier message: 22/05/2009, 02h54
  4. [PHP 4] [POO] objet rempli mais rien quand je l'affiche
    Par allserv dans le forum Langage
    Réponses: 8
    Dernier message: 15/04/2009, 23h27
  5. Réponses: 9
    Dernier message: 21/11/2008, 22h59

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