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

JPA Java Discussion :

persistence.xml: CONSTRAINTS INITIALLY DEFERRABLE


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut persistence.xml: CONSTRAINTS INITIALLY DEFERRABLE
    Bonjour,
    Mon problème est le suivant:

    J'ai un schema qui se crée lorsque je déploie mes EJB dans Glassfish.
    J'ai besoin de désactiver les contraintes afin d'insérer des jeux de tests (qui sont eux générés dans un ordre qui ne tient pas compte des contraintes, d'où le besoin).

    Afin de faire ca sans tenir compte des noms des contraintes, j'ai trouvé qu'une solution était d'utiliser la commande SET CONSTRAINTS ALL DEFERRED (dans postgresql), et de passer le tout dans une section BEGIN/ COMMIT (ce qui contourne l'autocommit de postgresql).

    Or les contraintes ne peuvent être mises à DEFERRED que si elles sont crées en statut INITIALLY DEFERRABLE.

    Leur création étant effectuée par TopLink (qui créé les contraintes en NOT DEFERRABLE par défaut).

    J'ai beaucoup de mal à trouver des réponses claires sur le net, la majorité des réponses concernent OPENJPA et non TopLink.

    Quelqu'un pourrait il m'aider svp?

    Merci par avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut TopLink/Postgresql CONSTRAINTS DEFERRABLE
    Adéfaut de réponses, je remercie quand même les personnes qui m'ont aidées dans mes recherches (Frédéric Brouard de SQLPro notammenthttp://sqlpro.developpez.com) et je vais vous faire part de mes conclusions.

    L'environnement était le suivant:
    Des EJB déployés dans openEJB,
    TopLink afin d'assurer la persistence
    Une base Postgresql 8.3

    Problème rencontré:

    Comment executer un script d'INSERT quand celui-ci est autogénéré dans un ordre ne respectant pas les contraintes entre les tables, générées par TopLink lors du déploiement des EJB?

    Solution trouvée:

    La solution optimale est d'effectuer l'opération suivante: désactiver les contraintes sur le schéma, exécuter le script d'insert, remettre les contraintes.

    Si cette opération est manifestement native avec Oracle, sous Postgresql ca se passe différemment. On ne peut pas "désactiver" les contraintes, mais les "déférer" (leur application ne prendra effet qu'avec un commit).

    Concrètement:
    - Placez vos requêtes dans une section Begin/commit (postgresql ne supportant plus le set autocommit off, les ordres passés après le BEGIN ne seront appliqués qu'avec la commande COMMIT).
    - inscrivez l'ordre SET CONSTRAINTS ALL DEFERRED;
    - Inscrivez vos requêtes d'INSERT.
    - exécutez

    Les INSERT se feront qu'ils respectent ou non les contraintes sur la/les tables concernées, en revanche le respect de celles-ci ne sera vérifié que lors du COMMIT. Vous comprenez ainsi que l'on peut insérer des données dans un schéma dans l'ordre que l'on souhaite.

    NEANMOINS LE PROBLEME EST ET DEMEURE...:
    Pour que la commande SET CONSTRAINTS ALL DEFERRED fonctionne, il faut que les contraintes aient été créées selon un des trois modes suivants:

    - DEFERRABLE: la contrainte opère après que l'ordre SQL qui la met en cause se soit appliqué au moment de la validation de la transaction

    - INITIALY DEFERRED: La contrainte sera déférée à l'initiation de chaque transaction sauf si elle est créée en NOT DEFERRABLE. En d'autres termes elle est vérifiée en fin de transaction

    - INITIALY IMMEDIATE: La contrainte sera appliquée immédiatement à l'initiation de la transaction.

    Or, TopLink crée manifestement les contraintes en mode...
    - NOT DEFERRABLE: LA contrainte opère dés que l'ordre SQL qui la met en cause est appliqué. Elle ne pourra jamais être déférée.

    (sources http://sqlpro.developpez.com)

    Ma recherche portait donc sur "Comment instantier la création des contraintes par TopLink en un de ces 3 modes (notemment DEFERRABLE bien sûr)".

    Il se trouve que manifestement il n'est pas possible (ou je suis passé à coté et dans ce cas je suis preneur de la solution) de modifier le mode de création avec TopLink.

    Avec cet environnement technique il ne vous reste donc que les deux solutions suivantes:
    - Générer vos insert dans un ordre respectant les contraintes sur les tables.
    - Dropper les contraintes (alter table...), effectuer les insert puis recréer les contraintes. Mais cette solution nécesssite bien sûr d'avoir connaissance du nom des contraintes appliquées sur les tables et de tenir à jour vos scripts...

    Voilà pour moi, si vous avez la solution, je suis preneur!
    Merci par avance.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    je ne peux pas jurer que cela est faisable avec TopLink mais avec Hibernate je procéderais de la façon suivante :

    subclasser le dialect PostgreSQL
    overwrite des méthodes qui génèrent le code qui ne me convient pas
    spécifier mon custom dialect comme étant celui à utiliser

    (si réellement il n'y aucun paramètre spécifique pour changer ce comportement : ce que je vérifierais d'abord dans le code source… là où le INITIALLY DEFERRABLE est généré… ce qui de toute façon est nécessaire pour faire le bon overwrite…)

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut TopLink/Postgresql CONSTRAINTS DEFERRABLE
    Oui justement c'est ce que j'aimerais bien faire.

    Mais je ne sais pas vraiment où chercher dans le code de TopLink afin de modifier le NO DEFERRABLE.


    Citation Envoyé par JeitEmgie Voir le message
    je ne peux pas jurer que cela est faisable avec TopLink mais avec Hibernate je procéderais de la façon suivante :

    subclasser le dialect PostgreSQL
    overwrite des méthodes qui génèrent le code qui ne me convient pas
    spécifier mon custom dialect comme étant celui à utiliser

    (si réellement il n'y aucun paramètre spécifique pour changer ce comportement : ce que je vérifierais d'abord dans le code source… là où le INITIALLY DEFERRABLE est généré… ce qui de toute façon est nécessaire pour faire le bon overwrite…)

Discussions similaires

  1. Problème: persistence.xml skipped
    Par Pschittt dans le forum JPA
    Réponses: 6
    Dernier message: 27/08/2010, 15h22
  2. Comment se passer de persistence.xml ?
    Par iceman dans le forum JPA
    Réponses: 1
    Dernier message: 08/08/2007, 14h55
  3. [EJB3] Persistence XML
    Par nidaya dans le forum JPA
    Réponses: 5
    Dernier message: 05/06/2007, 10h47
  4. [CF][C#/VS2003]Comment utiliser format de persistance Xml?
    Par Dobyan08 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 03/03/2006, 14h11
  5. Persistance xml
    Par safazz dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 07/12/2005, 16h30

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