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 :
En mode debug, une fois que j'efface la Classe, pas de soucis, elle n'est plus dans la base de données.
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 );
Pourtant la ligne classe = crud.retrieve(classe.getId()); retrouve bien cet objet.
Le code de retrieve est le suivant :
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.
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 }
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é![]()
Partager