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 :

JPA et procédures stockées


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    oum
    oum est déconnecté
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut JPA et procédures stockées
    Bonjour,
    j'ai un gros souci de procédures stockées.
    Voici le contexte: une application web avec jsf, spring, jpa, maven.

    Sur une page je DOIS :
    - sur appui d'un bouton appeler une procédure stockée qui remet la table à zéro et la regénère.
    - puis réafficher la table pour que l'utilisateur y fasse quelques retouches.
    Evidemment, cette table ne doit pas être regénérée à chaque lancement de programme, sinon le travail serait perdu.

    Voici ce que j'ai fait:
    - Je n'ai pas trouvé comment appeler des procédures stockées en jpa
    - donc j'ai essayé de le faire en java jdbc, mais ça n'a pas marché au commit parce que je me suis fait intercepter par le aop:txadvice qui couvre les transactions add, delete et update.
    - ensuite ça a planté lorsque je veux faire un select sur la table (nouvelle si le commit avait eu lieu). Je pense qu'il y aurait des problèmes de resynchronisation avec le cache.

    Je ne sais plus comment faire.
    Est-ce que quelqu'un saurait me conseiller ?

    oum

  2. #2
    Membre très actif
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Billets dans le blog
    1
    Par défaut
    Salut,
    @PrePersist La méthode sera appelée avant l’exécution d’EntityManager.persist().
    @PostPersist La méthode sera appelée après que l’entité sera devenue persistante. Si
    l’entité produit sa clé primaire (avec @GeneratedValue), sa valeur est
    accessible dans la méthode.
    @PreUpdate La méthode sera appelée avant une opération de modification de l’entité
    dans la base de données (appel des setters de l’entité ou de la méthode
    EntityManager.merge()).
    @PostUpdate La méthode sera appelée après une opération de modification de l’entité
    dans la base de données.
    @PreRemove La méthode sera appelée avant l’exécution d’EntityManager.remove().
    @PostRemove La méthode sera appelée après la suppression de l’entité.

    Pour enregistrer un écouteur, il suffit que l’entité utilise
    l’annotation @EntityListeners.

    ex :
    Code java : 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
    public class AgeCalculationListener {
     
     @PostLoad
     @PostPersist
     @PostUpdate
     public void calculateAge(Customer customer) {
      if (customer.getDateOfBirth() == null) {
       customer.setAge(null);
       return;
      }
      Calendar birth = new GregorianCalendar();
      birth.setTime(customer.getDateOfBirth());
      Calendar now = new GregorianCalendar();
      now.setTime(new Date());
      int adjust = 0;
      if (now.get(DAY_OF_YEAR) - birth.get(DAY_OF_YEAR) < 0) {
       adjust = -1;
      }
      customer.setAge(now.get(YEAR) - birth.get(YEAR) + adjust);
     }
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class DataValidationListener {
     
     @PrePersist
     @PreUpdate
     private void validate(Customer customer) {
      if (dateOfBirth.getTime() > new Date().getTime()) {
       throw new IllegalArgumentException("Invalid date of birth");
      }
      if (!phoneNumber.startsWith("+")) {
       throw new IllegalArgumentException("Invalid phone number");
      }
     }
    }

    Code java : 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
    @EntityListeners({DataValidationListener.class,
      AgeCalculationListener.class})
     @Entity
     public class Customer {
     
      @Id
      @GeneratedValue
      private Long id;
      private String firstName;
      private String lastName;
      private String email;
      private String phoneNumber;
      @Temporal(TemporalType.DATE)
      private Date dateOfBirth;
      @Transient
      private Integer age;
      @Temporal(TemporalType.TIMESTAMP)
      private Date creationDate;
    // Constructeurs, getters, setters
     }

    l'entityListener doit être déclaré dans le fichier de persistence: persitence.xml, <entity-listener>
    voila comment construire des procédures stockés en java, pour les procédures stockés en pl-SGBD je ne sais pas.
    Ces exemple sont tiré du livre lien rendons à César...

  3. #3
    oum
    oum est déconnecté
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    Salut Khaled,

    je te remercie pour ta réponse.
    Le lien renvoie sur une page blanche, tu dois avoir des droits que je n'ai pas (c'est un e-book ?).

    La solution que tu offres ne montre pas comment on appelle la procédure qui est stockée dans oracle.

    Pour ma part, j'ai trouvé une autre solution.
    J'ai écrit une classe en java jdbc qui appelle les procédures stockées et les exécute et j'ai bien pris soin cette fois de ne pas passer par DomainService qui est controlé par le transaction manager .
    <aop:config>
    <aop:pointcut id="domainMethods"
    expression="execution(* fr.XXXXX.*.domain.DomainServiceImpl.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="domainMethods" />
    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
    <tx:method name="add*" propagation="REQUIRED" />
    <tx:method name="delete*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    <tx:method name="generate*" propagation="SUPPORTS" read-only="false"/>
    <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
    </tx:advice>
    Tant que j'appelais une methode qui passait par DomainService puis DaoService, j'étais interceptée par le transaction-manager.
    Il m'a suffit de court-circuiter DomainService et DaoService.

    Mais je reconnais que cela ne fait pas très propre de mélanger jpa et jdbc.

    Je vais creuser ta réponse pour l'utiliser une autre fois.
    oum

  4. #4
    Membre très actif
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Billets dans le blog
    1
    Par défaut
    voici un [ame="http://www.google.com/search?channel=fs&q=pearson+livre+java+jave+ee6+glassfish&ie=utf-8&oe=utf-8"]lien[/ame] qui devrait je pense marcher longtemps, sinon tu n'as pas précisé le genre de procédures stockées.
    J'ai répondu sur un cas strictement java.
    Tout java a l'avantage d'etre independant du sgbd, cependant si il y a de l'existant c'est une autre affaire, et le coté createNativeQuery de EntityManager serais sûrement une piste.
    Cordialement Khaled

    Ps: pour le lien c'est le site de pearson qui bug, donc le livre c'est :
    Java EE 6 et GlassFish 3
    Antonio Goncalves
    Traduit par Éric Jacoboni,
    avec la contribution technique de Éric Hébert
    edition pearson

  5. #5
    oum
    oum est déconnecté
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    sinon tu n'as pas précisé le genre de procédures stockées.
    C'est le genre de procédure qui te droppe une table puis la recrée de façon compliquée à partir d'autres tables que tu n'auras plus besoin de relire ensuite.
    Elles sont déjà écrites et me sont imposées.
    L'une fait plus de 130 lignes, l'autre 75, en pl/sql.

    merci quand même
    oum

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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