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

Persistance des données Java Discussion :

Initialisation de la persistance et DAO.


Sujet :

Persistance des données Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    juin 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : juin 2004
    Messages : 106
    Points : 106
    Points
    106
    Par défaut Initialisation de la persistance et DAO.
    Bonjour,

    j'aimerai savoir si lorsque vous avez plusieurs objets DAO vous initialisez la persistance dans chaque objet ?
    J'initialise cette persistance dans le constructeur de la classe de la manière suivante et répète l'opération pour chaque DAO. Y-a-t-il une meilleure manière de procéder ?

    Exemple :
    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
     
    public class EleveDAO extends DAO<Eleve> {
        protected EntityManagerFactory emf;
     
     
        @PersistenceContext(unitName = "myPU")
        protected EntityManager em;
     
        public EleveDAO() {
            if (emf == null) {
                emf = Persistence.createEntityManagerFactory("myPU");
                em = emf.createEntityManager();
            }
     
        }
    Merci.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 271
    Points : 4 110
    Points
    4 110
    Par défaut
    Pas besoin de créer ton entityManager, il est déjà automatiquement créé par: @PersistenceContext(unitName = "myPU")

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    juin 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : juin 2004
    Messages : 106
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Pas besoin de créer ton entityManager, il est déjà automatiquement créé par: @PersistenceContext(unitName = "myPU")
    Merci pour ta réponse.
    Mon problème est que l'entityManager ne se crée pas automatiquement. Mon application est déployée sous glassfish avec le persistence.xml 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
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0"
    	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    	<persistence-unit name="myPU" transaction-type="JTA">
    		<jta-data-source>jdbc/myDS</jta-data-source>
    
    
    		<class>ch.myapp.domain.model.Book</class>
    		<class>ch.myapp.domain.model.Cours</class>
    		<class>ch.myapp.domain.model.Eleve</class>
    		<class>ch.myapp.domain.model.Publisher</class>
    	</persistence-unit>
    
    
    </persistence>
    Il me manque quelque chose ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 271
    Points : 4 110
    Points
    4 110
    Par défaut
    Normal. Il faut que ta classe EleveDao soit annotée pour que l’injection fonctionne.
    Tu peux utiliser par exemple @RequestScoped, ou un autre scope selon le besoin.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    juin 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : juin 2004
    Messages : 106
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Normal. Il faut que ta classe EleveDao soit annotée pour que l’injection fonctionne.
    Tu peux utiliser par exemple @RequestScoped, ou un autre scope selon le besoin.
    Merci pour ta réponse. Malgré l'annotation @RequestScoped, l'injection ne fonctionne pas. J'ai lu que cette injection ne fonctionnait que sur les ejb, et que sur les autres objets il faut créer cette persistance via la factory. Suis-je juste ?

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 271
    Points : 4 110
    Points
    4 110
    Par défaut
    J'aurais pensé que ça fonctionnerait avec un objet "managé", ton DAO avec l'annotation.
    J'avoue que je n'ai pas cette couche DAO comme toi. J'ai ma couche EJB dans laquelle j'injecte mon EntityManager et dans laquelle j'effectue mes traitements vers la base de données.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : janvier 2007
    Messages : 697
    Points : 1 237
    Points
    1 237
    Par défaut
    A noter que rien ne t’empêche d'annoter ton DAO avec @EJB. Par défaut il rejoindra la transaction courante (si elle existe).

    A noter que RequestScoped n'est pas lié au EJB mais à CDI (Context & Dependency Injection). Il devrait être cependant suffisant (à partir du moment où le serveur d'application embarque bien un container CDI (Weld, OpenWebBeans) en plus du container EJB. Tout les serveurs d'application récent le font)

    Selon les versions de Java EE, pour que l'injection CDI fonctionne, il peut y avoir besoin dans le dossier META-INF, d'un fichier beans.xml contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <beans
     
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                      http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
              bean-discovery-mode="all">
    </beans>
    bean-discovery-mode="all" pouvant être remplacé par bean-discovery-mode="annotated" en cas de démarrage de serveur trop long.

    Avec "annotated" l'injection fonctionnera uniquement sur les beans annotés. Avec "all" elle devrait fonctionner dans tout les cas.

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

Discussions similaires

  1. persistance en tant que aspect ou DAO
    Par je viens du sud dans le forum Général Java
    Réponses: 5
    Dernier message: 20/01/2018, 21h43
  2. Probleme d'initialisation avec DAO
    Par candrau dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/07/2011, 16h58
  3. [Hibernate 2] Bean session et persistance DAO
    Par archer dans le forum Hibernate
    Réponses: 4
    Dernier message: 19/04/2010, 16h55
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

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