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 :

Exception SQL impossible à catcher


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut Exception SQL impossible à catcher
    Bonjour,

    J'ai une classe GenericJpaDAO a:
    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
    public class GenericJpaDAO implements IGenericDAO {
     
    	protected static Log log = LogFactory.getLog(GenericJpaDAO.class);
     
    	@PersistenceContext(unitName = "myappli.hibernate")
    	EntityManager em;
     
    	public Object getReference(Class _class, Object _object) {
    		return em.getReference(_class, _object);
    	}
     
    	public void createObject(Object object) {
    		try {
    			em.persist(object);
    		} catch (LazyInitializationException lie) {
    			em.merge(em.merge(object));
    		}
    	}
    }
    Si dans mon appli, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {     
      createObject(myObj);
    } catch (Exception e) {
       log.error("je passe jamais ici!!");
    }
    Je ne tombe jamais dans le catch.

    Par exemple, j'essaie de créer un objet dans une table avec la même clé primaire qu'une ligne déjà en base
    -->j'ai dans mes logs java.sql.BatchUpdateException: ORA-00001: unique constraint (PREVL.PK_MYTAB) violated
    bla, bla, bla
    Alors que j'avais bien prévu le cas pour ne rien faire en cas d'échec de création de la ligne.

    Merci.

  2. #2
    Membre confirmé Avatar de Kazh Du
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 152
    Points : 561
    Points
    561
    Par défaut
    ta méthode createObject ne remonte pas d'exception, ne t'attend donc pas à ce qu'elle puisse en sortir. Pour cela il faudrait rajouter "throw Exception" à la déclaration de ta méthode.
    Par contre si tu n'as pas d'erreur lors de l’exécution (ton IDE ne "râle" pas parce qu'il s'attend à une gestion d'erreur), c'est que celle-ci est traitée ailleurs.
    Il ne te reste plus qu'à aller en profondeur dans ton code... Bon courage !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par Kazh Du Voir le message
    (..)c'est que celle-ci est traitée ailleurs.
    Il ne te reste plus qu'à aller en profondeur dans ton code...
    C'est tout le problème : aucune idée de ce qu'est le "ailleurs" parce qu'a priori, je ne peux creuser plus bas que em.persist(object);

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Le problème n'est pas là, c'est sur l'opération de commit que tu as ton exception, tu est déjà sorti de ta méthode create...
    En clair, si tu avais une valeur incorrecte dans ton objet (type par exemple), tu aurais une exception dans createObject()
    Là, c'est une contrainte d'intégrité qui claque => sur commit uniquement

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    OK, donc je ne peux rien intercepter dans mes méthodes Java pour éviter de voir cette erreur qui ne m'intéresse pas? (j'ai déjà un try...catch qui est sensé me permettre de gérer le cas où l'objet n'a pas été créé)

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Si, tu peux, mais pas au même endroit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Code appelant
    ...
    try
    {
       monEJB.createObject();
    }
    catch (...)
    {
       ...
    }
    Du coup, tu peux peut-être encapsuler le tout dans une méthode pour éviter d'avoir à trainer le tout. En passant par une façade, tu masques le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Façade
    ...
    public void createObject(MonOjbet obj)
    {
       try
       {
          monEJBMetier.createObject(obj);
       }
       catch (Exception e)
       {
           ...
       }
    }
    Une alternative consiste à utiliser un contexte extended qui te permet de gérer les transactions manuellement. Ton problème de base est lié au fonctionnement "normal" de JTA (c'est le conteneur qui gère les transactions), on peut lui dire de faire autrement.

Discussions similaires

  1. Exception impossible à catcher
    Par Christophe P. dans le forum Langage
    Réponses: 10
    Dernier message: 17/01/2007, 14h21
  2. Ne comprends pas une exception SQL
    Par n@n¤u dans le forum Outils
    Réponses: 3
    Dernier message: 13/07/2006, 13h04
  3. Gestion exceptions sql server 2000
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/10/2005, 10h27
  4. SQL : Impossible d'atteindre l'enregistrement spécifié
    Par Farbin dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 30/09/2005, 17h01
  5. [C#] Exception SQL
    Par Procto dans le forum ASP.NET
    Réponses: 6
    Dernier message: 29/09/2005, 16h42

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