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]Faire cohabiter JPA avec des requêtes JDBC


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut [JPA]Faire cohabiter JPA avec des requêtes JDBC
    Bonjour,
    Je débute en JPA, et il y a un truc que je n'ai pas du comprendre :
    Dans le contexte d'une aplli éducatiove, je crée un CRUD sur mes objets Classe et je veux tester le Create puis le Delete.
    Le Create utilise JPA. Le Delete utilise SQL directement (plus simple à gérer).

    Ca ressemble à ca :

    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
    21
     ClasseCrud crud = new ClasseCrud();
    
        //    Classe classe = new Classe(idClasse, name, number, niveau, school);
            Classe classe = crud.create("Terminale Test", 3, mock.getTerminale(), mock.getIsbos() );
    
            assertTrue(classe.getId()>0 );
            classe = crud.retrieve(classe.getId());
            assertTrue(classe.getName().equalsIgnoreCase("Terminale Test") );
            assertTrue(classe.getNumber()==3 );
    
            crud.deleteClasse(classe.getId(), mock.getJdbc());
    
            boolean found=false;
            try {
                classe = crud.retrieve(classe.getId());//doit lancer NotFoundException
                found=true;
            } catch (NotFoundException ex) {
    
            }
            assertFalse("The classe still exists",found );
    En mode debug, une fois que j'efface la Classe, pas de soucis, elle n'est plus dans la base de données.
    Pourtant la ligne classe = crud.retrieve(classe.getId()); retrouve bien cet objet.
    Le code de retrieve est le suivant :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     public Classe retrieve(int idClasse) throws JPAException, NotFoundException {
    
            Classe classe;
            SclClasse c;
            try {
    
                EntityManager em = Persistence.createEntityManagerFactory("wsedupassionTestPU").createEntityManager();
                EntityTransaction tx = em.getTransaction();
                tx.begin();
    
                c = em.find(SclClasse.class, idClasse);
    //ici, c n'est pas null : JPA trouve un objet avec id=15, alors qu'il n'est pas dans la Bd
                tx.commit();
                em.clear();//clear ou close ne chage rien
    
    
            } catch (Exception ex) {
                MyLog.sendLog(ex, "JPA Exception :" + ex.getMessage());
                throw new JPAException(ex.getMessage());
            }
    
            if (c == null) {//On devrait avoir l'exception
                throw new NotFoundException("classe :" + idClasse + " not found");
            }
    
            School school = new SchoolCrud().retrieve(c.getIdSchool());
            classe = mapClasse(c, school);
            return classe;//On a un objet Classe, pourtant effacé dans la Bd
        }
    Je me suis dit que les EntityManager pouvait tout garder en mémoire dans leur système de management à eux. Pourtant j'utilise à chaque fois la Factory pour créer un nouvel Entity Manager. Et que j'utilise em.clear() ou em.close() ne change rien.

    Pour l'instant, ca n'empêche pas mon appli de fonctionner, mais c'est quand même un soucis. Ya un truc fondamental que je n'ai pas pigé

  2. #2
    Membre chevronné Avatar de nicocsgamer
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 321
    Par défaut
    Tu peux utiliser la methode flush pour synchroniser ton Entitymanager à ta BD.

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut
    Citation Envoyé par nicocsgamer Voir le message
    Tu peux utiliser la methode flush pour synchroniser ton Entitymanager à ta BD.
    Ben ca serait logique, et pourtant non....

    Mon débuggueur fait des pauses. Je met des flush() partout. Je check ma DB, tout semble bon.
    Et pourtant mon EntityManager fraichement créé me trouve un objet venu des catacombes de je ne sais quelle mémoire.



    Ca fait longtemps que je n'avais pas vu un truc aussi chelou. Ou alors c'est un truc VRAIMENT très con caché quelque part.

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut
    J'ai fais plusieurs tests sans succès, dont un sleep() dans un thread de 10 secondes.
    Rien n'y fait.

    J'ai ensuite remplacé mes Delete SQL par des EntityManager.remove()

    Et là, hop, tout va bien.
    Il y a donc un choix à faire entre les EntityManager et le SQL dans la configuration par défaut. Je ne suis malheureusement pas expert là-dedans, il doit bien y avoir un truc à paramétrer.

    Heureusement, ca ne me gène pas de passer dans du tout JPA. Sans quoi je pense que j'aurais passé de sales quart d'heure.

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut
    Ca devient d'autant plus étrange que même en utilisant l'EntityManager pour faire des queries, je n'y arrive pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query=em.createNativeQuery("DELETE FROM scl_classe WHERE idClasse="+idClasse);
                query.executeUpdate();
    em.flush();
    Ca efface bien dans la base de donnée, mais ensuite le retrieve trouve l'objet effacé.

    Par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<SclClasse> listClasses = em.createQuery("Select c FROM SclClasse c WHERE c.idClasse = "+idClasse).getResultList();
    for (int i=0;i<listClasses.size(); i++){
                    em.remove(listClasses.get(i));
                }
    Ainsi j'efface dans la base de données ET le retrieve ne retrouve rien ! Comme souhaité.

Discussions similaires

  1. Problème avec des requêtes
    Par yoda7666 dans le forum ASP
    Réponses: 13
    Dernier message: 09/03/2006, 18h16
  2. Ouverture d'un formulaire avec des requêtes différentes
    Par Jérémy VAUTIER dans le forum Access
    Réponses: 3
    Dernier message: 02/03/2006, 07h31
  3. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33
  4. [SELECT] Faire un select avec des champs vides
    Par MinsK dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/08/2005, 00h05
  5. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37

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