Partage
  • Partager sur Facebook
  • Partager sur Twitter

bdd recréée à chaque entitymanagerfactory créé

    2 février 2024 à 23:30:58

    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 :
    <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>
    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.

            Voici comment je crée mes managers d'entité :
    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();
    A ce niveau, ma base de données a été créée et contient des lignes. Jusque là, pas de problème.

            Par contre, dès que je veux faire une insertion complémentaire, j'écris de nouveau le même code que précédemment :
    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();

     Et là, ma base de donnée ne contient que le dernier élément que j'ai inséré. Tout le reste à disparu.

    J'imagine que c'est par rapport à la valeur "create" utilisé dans la configuration de la propriété suivante :
    <property name="hibernate.hbm2ddl.auto" value="create"/>

    La base de données recrée à chaque fois que je crée un nouvel EntityManagerFactory (en tout cas, c'est le constat que j'ai fait).

    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 ?
    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();
            }
        }
    
    }
    Sincèrement, j'ai passé [B]beaucoup[/B] de temps à chercher en ligne, en faisant pas mal d'essais mais après plusieurs heures, j'avoue ne pas trouver la solution.

    Merci de m'éclairer sur les questions posées et sur une solution ou une piste.

    Bien à vous.
    • Partager sur Facebook
    • Partager sur Twitter
    Une virgule, un point ne sont pas des éléments de décoration typographique !
      8 avril 2024 à 8:14:18

      Salut, en terme de stockage pour hibernate tu as une première solution c'est utiliser JPA avec les @Entity mais surtout je pense que ton problème viens des permissions accordés à hibernate, lui as tu créer un user propre avec les permissions restreinte a UPDATE, DELETE et SELECT ou tu lui as passé le root ?

      Le fait de restreindre les permissions de l'user que tu créera pour hibernate évitera déjà la remise à 0 de ta DB parce que hibernate est un ORM fait pour justement créer des database adapté aux besoins, pour la phase de test il est logiquement plus pratique de reset la DB a chaque lancement, cependant pour la version de prod ca n'a plus aucun intérêt.

      Personnellement sur la prod je restreint les perms, mais tu doit certainement avoir une variable ou paramètre qui permet ça aussi.

      • Partager sur Facebook
      • Partager sur Twitter

      Développer n'est pas une question d'intelligence, juste une façons d'interprété les choses de façons logique --- SAUF QUAND CA BUG

      bdd recréée à chaque entitymanagerfactory créé

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown