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 :

Tester un DAO


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut Tester un DAO
    Bonjour,

    J'ai la classe DAOTester suivante:

    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
    ...
    
    
    
    public class DAOTester {
    
    
    	public static void main(String[] args) {
    
    
    		EntityManagerFactory factory = Persistence.createEntityManagerFactory("myPU");
    		EntityManager em = factory.createEntityManager();
    		em.find(Eleve.class, 1);
    		
    	}
    
    
    }
    et le fichier 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
    18
    <?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>java:jboss/datasources/myDS</jta-data-source> -->
    		<jta-data-source>jdbc/myDS</jta-data-source>
    
    
    		<class>ch.myapp.bean.entity.Book</class>
    		<class>ch.myapp.bean.entity.Cours</class>
    		<class>ch.myapp.bean.entity.Eleve</class>
    		<class>ch.myapp.bean.entity.Publisher</class>
    	</persistence-unit>
    </persistence>
    Lorsque je teste ma classe, j'ai l'erreur suivante :

    [EL Severe]: ejb: 2018-02-11 15:13:14.07--ServerSession(342597804)--Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: Cannot acquire data source [jdbc/myDS].
    Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/myDS' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.NullPointerException]]
    Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: Cannot acquire data source [jdbc/myDS].
    Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/myDS' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.NullPointerException]]
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:815)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:305)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:337)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:303)
    at ch.myapp.test.datasource.DAOTester.main(DAOTester.java:22)
    Caused by: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: Cannot acquire data source [jdbc/myDS].
    Internal Exception: javax.naming.NamingException: Lookup failed for 'jdbc/myDS' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is j
    ...


    Mon application est parfaitement déployée sur glassfish 4. Lorsque je teste mon bean depuis une classe de test, pas de problème, j'accède à mes 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
    @Stateless
    @LocalBean
    public class MySessionBean implements MySessionBeanRemote, MySessionBeanLocal, Serializable {
    
    
    	private EleveDAO dao;
    
    
    	@PersistenceContext(unitName = "myPU")
    	private EntityManager em;
    
    
    	public Book findBookById(int id) {
    		Book b = em.find(Book.class, id);
    		return b;
    }
    Par contre, si j'essaye d'accéder à mon implémentation du DAO depuis le bean, cela ne fonctionne pas et j'ai l'erreur qui s'affiche.

    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
    
    public class EleveDaoImpl implements EleveDAO {
    	
    @PersistenceContext(unitName = "myPU")
    	private EntityManager em;
    
    
    	
    @Override
    public Eleve findById(int id) throws DAOException {
    	
    	Eleve e = em.find(Eleve.class, id);
    	em.close();
    return e;
    
    
    }
    
    Auriez-vous une piste à me proposer ?

    merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Alors pour tester une classe, en général, on utilise des outils comme JUnit ou TestNG

    Ensuite, ton DAOTester tournant en dehors de tout environnement J2EE, c'est à lui de créer un DataSource et de la binder sur le JNDI pour que l'entityManager la trouve. Faudra probablement aussi créer un transaction manager à priori et tout le toutim derrière. C'est pas une cinécure à mettre en place à la main

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Alors pour tester une classe, en général, on utilise des outils comme JUnit ou TestNG

    Ensuite, ton DAOTester tournant en dehors de tout environnement J2EE, c'est à lui de créer un DataSource et de la binder sur le JNDI pour que l'entityManager la trouve. Faudra probablement aussi créer un transaction manager à priori et tout le toutim derrière. C'est pas une cinécure à mettre en place à la main
    merci pour ta réponse.
    Ce que j'aimerais, c'est passer la partie "données" dans un sous-projet domain.jar) qui contiendra mes Entity Bean ainsi que les accès à la base de données via JPA. Jusqu'à maintenant, cette partie était incluse dans ma partie EJB. J'accède actuellement via une classe de test à mon bean et ses méthodes sur le server glassfish, pas de problème. Par contre si je déplace la partie JPA dans mon sous-projet, je n'accède plus, via mon bean aux données.

    Je ne sais pas si c'est plus clair?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Ayez un autre persistence.xml pour les tests, à part le scanning des classes @Entity, le reste sera assez différent, à commencer par le gestionnaire de transaction.
    Et ne pas mettre les DAO/Repository dans le même JAR que les @Entity, vous simplifiera la vie.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    Ayez un autre persistence.xml pour les tests, à part le scanning des classes @Entity, le reste sera assez différent, à commencer par le gestionnaire de transaction.
    Et ne pas mettre les DAO/Repository dans le même JAR que les @Entity, vous simplifiera la vie.
    merci pour la réponse. Vous les mettez où les DAO/repository ?
    J'ai dans mon projet un sous-projet pour les ejb, un autre les les entités et les DAO, un autre pour la partie client.
    Vous séparez encore les DAO dans leur propre jar ?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Fr@ncky Voir le message
    merci pour la réponse. Vous les mettez où les DAO/repository ?
    J'ai dans mon projet un sous-projet pour les ejb, un autre les les entités et les DAO, un autre pour la partie client.
    Vous séparez encore les DAO dans leur propre jar ?
    à partir d'une certaine taille du projet, oui.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/09/2014, 18h16
  2. Réponses: 5
    Dernier message: 28/03/2012, 17h04
  3. Tester connexion Internet active sous Windows
    Par Altau dans le forum Développement
    Réponses: 3
    Dernier message: 12/08/2002, 12h43

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