Bonjour à toutes et tous,
Je débute en java.
Je souhaite créer une base de données et la remplir au lancement d'une application. Cela fonctionne parfaitement. J'utilise les annotations de mappage et un fichier persistence.xml avec l'unité de persistance suivante :
J'ai utilisé la valeur "create" car je veux que la bdd soit créée à chaque lancement de l'application (c'est une nécessité). Les données de la base n'ont d'intérêt que durant l'exécution de l'application.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <persistence-unit name="unity"> <properties> <property name="hibernate.dialect" value="org.hibernate.community.dialect.SQLiteDialect" /> <property name="jakarta.persistence.jdbc.driver" value="org.sqlite.JDBC" /> <!-- la bdd doit être recréé à chaque lancement du programme --> <property name="hibernate.hbm2ddl.auto" value="create"/> <!-- afficher le sql joué par Hibernate --> <property name="hibernate.show_sql" value="false"/> <!-- formater le sql (sans quoi il est affiché en ligne) --> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit>
Voici comment je crée mes managers d'entité :
A ce niveau, ma base de données a été créée et contient des lignes. Jusque là, pas de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 EntityManagerFactory emf = Persistence.createEntityManagerFactory(AppConfiguration.PERSISTENCE_UNIT_NAME_INITIALIZATION, Collections.singletonMap("jakarta.persistence.jdbc.url",AppConfiguration.jdbcUrl)); EntityManager em = emf.createEntityManager(); //debut de la transaction //persistance de plusieurs objets //commit //fermeture des ressources des managers emf.close(); em.close();
Par contre, dès que je veux faire une insertion complémentaire, j'écris de nouveau le même code que précédemment :
Et là, ma base de donnée ne contient que le dernier élément que j'ai inséré. Tout le reste à disparu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 EntityManagerFactory emf = Persistence.createEntityManagerFactory(AppConfiguration.PERSISTENCE_UNIT_NAME_INITIALIZATION, Collections.singletonMap("jakarta.persistence.jdbc.url",AppConfiguration.jdbcUrl)); EntityManager em = emf.createEntityManager(); //debut de la transaction //persistance d'un objet //commit //fermeture des ressources des managers emf.close(); em.close();
J'imagine que c'est par rappport à la valeur "create" utilisé dans la configuration de la propriété suivante :
La base de données est de nouveau créée (donc vidée) à chaque fois que je crée un nouvel EntityManagerFactory (en tout cas, c'est le constat que j'ai fait).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <property name="hibernate.hbm2ddl.auto" value="create"/>
Donc, comment dois-je m'y prendre pour que :
- au lancement de l'application, ma base de données est créée et remplie (ce que j'arrive à faire mais peut être que je devrais faire autrement)
- durant l'exécution de l'application, je dois pouvoir interroger la base de données, ajouter des éléments, en modifier, en supprimer, bref un usage classique de la bdd. Mais comment dois-je le faire. J'ai regardé beaucoup de tutos mais à chaque fois, je n'ai qu'un exemple qui ne mobilise q'une seule transaction.
En plus de cela, je me pose donc quelques questions :
* faut-il un entitymanagerfactory et un entitymanager pour chaque transaction ?
Je me suis créé une classe pour récupérer plus facilement l'entitymanager mais est-ce que ce que je fais est correcte ?
Sincèrement, j'ai passé beaucoup de temps à chercher en ligne, en faisant pas mal d'essais mais après plusieurs heures, j'avoue ne pas trouver la solution.
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 public class EntityManagerUtil { EntityManagerFactory emf; EntityManager em; public EntityManagerUtil() { this.emf = Persistence.createEntityManagerFactory(AppConfiguration.PERSISTENCE_UNIT_NAME_INITIALIZATION, Collections.singletonMap("jakarta.persistence.jdbc.url",AppConfiguration.jdbcUrl)); this.em = emf.createEntityManager(); } protected EntityManagerFactory getEntityManagerFactory(){ return emf; } public EntityManager getEntityManager(){ return em; } public void closeResourcesManager () { if (em != null && em.isOpen()) { em.close(); } if (emf != null && emf.isOpen()) { emf.close(); } } }
Merci de m'éclairer sur les questions posées et sur une solution ou une piste.
Bien à vous.
Partager