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

JPA Java Discussion :

Lien entre un projet EJB/JPA/Web Dynamique (Débutant)


Sujet :

JPA Java

  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Points : 161
    Points
    161
    Par défaut Lien entre un projet EJB/JPA/Web Dynamique (Débutant)
    Je suis débutant dans la technologie J2EE, et j'avance pas à pas, actuellement je suis bloqué au niveau de la communication Web - EJB -Persistance et Persistance - EJB -Web
    - J'ai créé un projet Web Dynamique dans lequel j'ai 4 formulaires JSP qui communiquent normalement avec ma Servlet et s'échangent les données sans problème

    - J'ai ensuite créer un Projet EJB3 dans lequel j'ai un simple EJB qui m'affiche simplement un message.

    - J'ai créer un projet JPA dans lequel j'ai mes 4 Entity Beans de persistance représentant mes 4 tables (qui sont des persistances pour mes 4 formulaires)

    Je suis buté aux problème suivant

    1) J'ai déjai essayé de faire communiquer mon Projet EJB avec mon Projet web en intégrant simplement le projet EJB dans le Buid Parth du dans mon Projet Web (dans l'onglet Projet) et en l'appelant dans ma Servlet. Mais lorsque j'exécute ma Servlet, le message provenant du EJB s'affiche one fois, puis a la prochaine exécution, il affiche null, ainsi de suite, alternant entre le message et null

    2) Deuxièmement, je ne sais pas comment faire communquer mon projet JPA avec le projet EJB de telle sorte que la Logic pour communiquer et gérer la persistance

    3) Enfin Comment faire pour récuperer les données venant du projet de persisatance (JPA) à partir de ma Serlet pour afficher dans mes formulaire ou alors partir de la Servlet (récupérer les données du formulaire) pour la persistance.

    Quelqu'un a-t-il des directives ou un tuto ?
    Outils de travail : Eclipse Helios J2EE ; Jboss 6

    Merci

  2. #2
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Points : 161
    Points
    161
    Par défaut
    Le premier problème du d'affichage de null est résolu, j'avais en fait un message dans mon code que je ne répérais pas.

    Maintenant il me reste à faire communiquer les trois projets ou les trois couches ( Web - EJB - JPA )
    Comment faire en fait pour récupérer les données venant du projet de persistance (JPA) à partir de ma Sevrlet passant par mes EJB 3 pour afficher dans mes formulaire ou alors partir de la Servlet (c'est à dire récupérer les données du formulaire) pour les envoyer dans mes Entity de persistance passant par les EJB 3

  3. #3
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Points : 161
    Points
    161
    Par défaut
    Après m'etre cassé la tête pendant 3 jours sans les livres et sur le Net, je n'ai toujours pas la solution, personne pour m'aider ??

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Bonjour,

    Puisque tu es débutant en Java EE, il vaut mieux commencer par des choses simples. Et comme j'imagine que tu fais ton apprentissage avec la dernière version du standard (JavaEE6), tu as juste besoin de créer un projet Web contenant tes JSPs, tes Servlets, tes EJBs, et tes entités JPA. Ensuite tu packages le tout dans un .war que tu déploies directement sur JBoss 6 (ou GlassFish 3) et c'est tout. Pour la communication entre les différents composants, tu fais l'injection de l'EJB dans la servlet, puis de l'EntityManager dans l'ejb; la page jsp peut avoir directement accès à l'entité JPA. C'est vraiment hyper-simple maintenant de réaliser une "petite" application JavaEE fonctionnelle en quelques lignes de code.

    Tiens, un petit exemple rapide pour te donner une idée:

    L'entity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    public class Customer {
       @Id
       private int id;
       private String name;
       ...
    }
    L'EJB:
    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
    public class CustomerServiceBean {
       @PersistenceContext
       private EntityManager em;
     
       public Customer createCustomer(Customer customer) {
           em.persist(customer);
           return customer;
       }
     
       public Customer findByPrimaryKey(int id) {
           return em.find(Customer.class, id);
       }
       ...
    }
    La servlet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class CustomerServlet extends HttpServlet {
       @EJB private CustomerServiceBean service;
     
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ... {
            Integer id = Integer.valueOf(request.getParameter("id"));
            Customer customer = service.findByPrimmaryKey(id);
            resquest.setAttribute("customer", customer);
            ...
       }
    }
    Ensuite sur ta page JSP, tu peux accéder à l'objet "customer" qui a été mis dans le scope request.

    Et ainsi de suite...
    Tu peux aller voir le tutorial JavaEE6 pour plus d'exemples.

    Bon courage.
    SCJP 5 / SCBCD 1.3 Certified

  5. #5
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Points : 161
    Points
    161
    Par défaut
    OK, merci beaucoup manblaizo. En fait j''ai passé près de 3 mois a étudier et je suis lancé dans la pratique il y a quelques semaines. J'ai pris un petit projet école de 4 table (Etudiant, Classe, Filiere, Enseignant) dans ma base de donnée MySQL. et je voulait au travers de ce projet, mettre en pratique toutes les notions aprises. J'ai créer un projet web avec Serlet et 4 formulaires jsp et un projet JPA où j'ai mapper les tables avec mes Entity Beans et un projet EJB où j'ai quelques petits EJB.

    Je manipule déjà moyennement les Servlet et les JSP (récupération des donnés, paramètres, passage de paramètres entre les pages,....). Et je me butais dons au problème de faire persister les données effectivement dans ma table MySQL et faire le lien entre les 3 projets.

    Mais qu'à cela ne tienne, j'ai suivis ton conseil et j'ai créer le projet web et implémenter ces trois parties que tu as détaillé plus haut. Et là encore j'ai eu un petit problème celui de la gestion de la connexion à la Base de données MySQL pour faire effectivement persister l'objet Customer.

    Je pensais qu'après avoir ajouter la librairie du connecteur de MySQL dans mon CLASSPATH et après avoir créer le fichier persistence.xml suivant dans mon répertoire META-INF, ça marcherait :
    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="ProjetWeb" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>ejbPackage.customer</class>
    <properties>
    <property name="eclipselink.jdbc.password" value=""/>
    <property name="eclipselink.jdbc.user" value="root"/>
    <property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    <property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/scolarite"/>
    <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    <property name="eclipselink.logging.level" value="INFO"/>
    </properties>
    </persistence-unit>
    </persistence>
    Partout où je rencontre le fichier persistence.xml, il est simplement dit qu'il doit être placé dans le répertoire META-INF, aucune autre indication n'est donnée.

    Comment configurer ce fichier et comment le manipuler pour que je puisse effectivement persister mes données et les récupérer à nouveau de ma BD ? Ce sera pour moi un grand pas.

    Merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Bonjour,

    Tu pourrais détailler un peu ce qui ne marche pas, ou quelle erreur tu obtiens ?

    Par contre, il faudrait enlevé l'attribut transaction-type="RESOURCE_LOCAL", ou mettre transaction-type="JTA" dans ton ficihier persistence.xml, parce que tu déploies sur un serveur d'applications; par défaut la valeur est JTA.

    Ce fichier persistence.xml, tu peux le mettre dans WEB-INF/classes/META-INF/

    J'espère que ça résout ton problème.
    SCJP 5 / SCBCD 1.3 Certified

  7. #7
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Points : 161
    Points
    161
    Par défaut
    J'ai mon entité Customer :
    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
    30
    31
     
    package ejbPackage;
     
    import javax.persistence.*;
     
    @Entity
    public class Customer {
    	@Id
    	private int num;
    	private String nom;
    	private String prenom;
     
    	public int getNum() {
    		return num;
    	}
    	public void setNum(int num1) {
    		num = num1;
    	}
    	public String getNom() {
    		return nom;
    	}
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    	public String getPrenom() {
    		return prenom;
    	}
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    }
    Et j'ai créer une classe main simple TestJPA que j'exécute comme une application Java, bien que ce soit un projet web que j'ai créé, mais je veux simplement tester la persistance sans passer par une Servlet pour le moment :
    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
     
    package ejbPackage;
    import javax.persistence.*;
     
    public abstract class TestJPA {
     
    	@PersistenceContext
    	private static EntityManager em;
    	private static Customer c; 
     
    	public static void main(String[] args) {
     
    		c.setNom("Tchapda");
    		c.setNum(20); 
    		c.setPrenom("Jean Pierre");
    		em.persist(c);
    	}
     
    }
    Lorsque j'exécutais, je reçevais le message selon lequel property eclipselink is deprecated use javax.persistence instead, donc dans mon fichier de persistance j'ai ceci :
    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="AllInOne" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>ejbPackage.Customer</class>
    <properties>
    <property name="javax.persistence.jdbc.password" value=""/>
    <property name="javax.persistence.jdbc.user" value="root"/>
    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/scolarite"/>
    <property name="javax.persistence.ddl-generation" value="drop-and-create-tables"/>
    <property name="javax.persistence.logging.level" value="INFO"/>
    </properties>
    </persistence-unit>
    Lorsque j'exécute, je reçoit le message d'erreur suivant :
    Exception in thread "main" java.lang.NullPointerException
    at ejbPackage.TestJPA.main(TestJPA.java:12)
    Merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par mesken Voir le message
    Et j'ai créer une classe main simple TestJPA que j'exécute comme une application Java, bien que ce soit un projet web que j'ai créé, mais je veux simplement tester la persistance sans passer par une Servlet pour le moment
    Ah ben, dans ce cas, ça veut dire que tu ne testes pas sur un serveur d'applications, donc plus de transactions JTA et plus d'injection de dépendance.

    Le code de ta classe de test va donc être:
    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
    30
     
    package ejbPackage;
    import javax.persistence.*;
     
    public class TestJPA {
     
    	private static Customer c; 
     
    	public static void main(String[] args) {
     
                   EntityManagerFactory emf =
                          Persistence.createEntityManagerFactory("AllInOne");
                   EntityManager em = emf.createEntityManager();
     
                   c = new Customer();
     
    		c.setNom("Tchapda");
    		c.setNum(20); 
    		c.setPrenom("Jean Pierre");
     
                    em.getTransaction().begin();
    		em.persist(c);
                    em.getTransaction().commit();
     
                    // refermer em et emf
                    em.close();
                    emf.close();
    	}
     
    }
    Et ensuite tu remets RESOURCE_LOCAL pour transaction-type.

    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="AllInOne" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>ejbPackage.Customer</class>
    <properties>
    <property name="javax.persistence.jdbc.password" value=""/>
    <property name="javax.persistence.jdbc.user" value="root"/>
    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/scolarite"/>
    <property name="javax.persistence.ddl-generation" value="drop-and-create-tables"/>
    <property name="javax.persistence.logging.level" value="INFO"/>
    </properties>
    </persistence-unit>
    Voilà.
    SCJP 5 / SCBCD 1.3 Certified

  9. #9
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Points : 161
    Points
    161
    Par défaut
    Merci beaucoup manblaizo, ça marche !!! J'y avais passé des jours. Juste une dernière question stp.

    Maintenant alors que j'arrive à persister mes objet sans problème dans un projet à part , comment faire pour persister à partir de ma Servlet(qui se trouve dans le Projet Web) des objets se trouvant dans mon projet de Persistance (ProjetJPA) ? C'est à dire j'arrive à récupérer les données entrées dans mon formulaire à partie de ma Servlet sans problème, comment faire pour appeler mes setters et getters du Projet JPA pour allouer ces valeurs, ainsi que la méthode createCustomer() qui s'y trouve également pour créer le Customer ? Ceci est également valable si je veux ajouter une autre couche (ProjetEJB) qui ne contiendra que ma logique métier. J'en ferai l'objet d'un post a part

    Merci

Discussions similaires

  1. Réponses: 11
    Dernier message: 30/05/2011, 16h13
  2. [EJB3] [Eclipse] problème de références entre un projet EJB et son client
    Par olivier57b dans le forum Java EE
    Réponses: 2
    Dernier message: 17/03/2010, 16h00
  3. Changer la nature d'un projet Java en projet de type Web Dynamique ?
    Par shaun_the_sheep dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 14/01/2010, 16h50
  4. Lien entre BDD Access et Appli Web Foireux
    Par BqiKo dans le forum Access
    Réponses: 4
    Dernier message: 21/07/2009, 10h51
  5. [C#] liens entre différents projets
    Par rastali dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2005, 10h07

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