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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    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
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    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 régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    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
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    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