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 :

JTA - JPA - EJB


Sujet :

Persistance des données Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut JTA - JPA - EJB
    Bonjour,
    je débute en développement J2EE.
    Je fais juste un formulaire avec un champs, que je souhaite stocker en base.
    Et c'est la misère .

    J'utilise JSP - EJB - JPA et serveur Glassfish et eclipse
    J'ai installé Mysql, j'ai crée un pool de connexion dans glassfish, ça ping correctement.
    Ensuite dans le projet JPA, dans mon fichier persistence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <persistence version="1.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_1_0.xsd">
    	<persistence-unit name="SimpleJPA" transaction-type="JTA">
    		<provider>oracle.toplink.essentials.PersistenceProvider</provider>
    		<jta-data-source>jdbc/adee</jta-data-source>
     
    		<class>table.Groupe</class>
    	</persistence-unit>
    </persistence>
    Il faut savoir j'ai testé avec un client standalone, je récupère bien un champs après une requête JPQL. Donc la connexion à la base s'effectue bien
    dans le projet 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    package sample;
     
    import javax.annotation.Resource;
    import javax.ejb.*; 
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.PersistenceContext;
    import javax.persistence.EntityManager;
    import javax.transaction.UserTransaction;
     
    import table.Groupe;
     
    @Stateless(name="Example", mappedName="ejb/SimpleBeanJNDI") 
    public class SimpleBeanImpl implements SimpleBean {
     
     
        public String sayHello(String name) { 	
            return "Hello " + name + "!"; 	
        }
     
        @PersistenceContext(unitName = "SimpleJPA")
        private EntityManager em;
     
    	public Groupe createGroupe(Groupe groupe) {
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("SimpleJPA");
    		EntityManager em = emf.createEntityManager();
    		EntityTransaction tx = em.getTransaction();
    		tx.begin();
     
    		em.persist(groupe);
    		tx.commit();
    		em.close();
    		emf.close();
    		return groupe;
     
    	}
     
    }
    et dans la page jsp :

    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
     
     
      <body>
        <%
     
    	//InitialContext context    = new InitialContext();
    	//DataSource dataSource = (DataSource) context.lookup("jdbc/adee");
    	InitialContext ctx = new InitialContext();
    	SimpleBean bean = (SimpleBean) ctx.lookup("ejb/SimpleBeanJNDI");
     
    	String s1 = request.getParameter("num1");
    	String result = bean.sayHello(s1);
    	Groupe g = new Groupe();
    	g.setNom(s1);
    	bean.createGroupe(g);
    	out.println(result);
    	out.println("Database updated successfully");
     
    %>
      </body>
    il faut savoir que si j'enleve bean.createGroupe(g), le résultat affiche bien dans le navigateur la valeur du champs saisi, j'aimerai juste l'ajouter dans ma base.

    et voici lors de l'envoi du formulaire, l'erreur affichée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    exception 
     
    org.apache.jasper.JasperException: javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.RemoteException: null; nested exception is: 
    	java.lang.IllegalStateException: 
    Exception Description: Cannot use an EntityTransaction while using JTA.
    root cause 
     
    javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.RemoteException: null; nested exception is: 
    	java.lang.IllegalStateException: 
    Exception Description: Cannot use an EntityTransaction while using JTA
    Donc si vous avez une idée, je suis preneur

  2. #2
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    A partir du moment où tu utilises JTA, tu ne peux plus utiliser les transactions locales (EntityTransaction obtenues avec le em.getTransaction() ).
    Si tu veux conserver ton code source il faut, dans ton persistence.xml, remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <jta-data-source>jdbc/adee</jta-data-source>
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <non-jta-data-source>jdbc/adee</non-jta-data-source>
    Si tu veux rester avec JTA (et ne pas modifier le fichier XML), il faut utiliser les annotations @TransactionManagement

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <non-jta-data-source>jdbc/adee</non-jta-data-source>
    en enlevant aussi transaction-type = "JPA".

    y a une erreur lors du déploiement.

    Ensuite j'ai essayé en conservant JTA.

    voici mon code :
    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
     
    @TransactionManagement(TransactionManagementType.CONTAINER)
     
    @Stateless(name="Example", 
    		   mappedName="ejb/SimpleBeanJNDI") 
     
    public class SimpleBeanImpl implements SimpleBean {
     
        @PersistenceContext(unitName = "SimpleJPA")
        private EntityManager em;
     
        public String sayHello(String name) { 	
            return "Hello " + name + "!"; 	
        }
     
     
        @TransactionAttribute(value=TransactionAttributeType.REQUIRED)
        public Groupe createGroupe(Groupe groupe) {
    		em.persist(groupe);
    		return groupe;
     
    	}
     
    }
    voici le message d'erreur lors de la soumission du formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    exception 
     
    org.apache.jasper.JasperException: javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
    	javax.transaction.RollbackException: Transaction marked for rollback.
    root cause 
     
    javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.; nested exception is: 
    	javax.transaction.RollbackException: Transaction marked for rollback.

  4. #4
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    En mode hors JTA, peut-être faudrait-il que tu spécifies explicitement l'utilisation des tx locales en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transaction-type="RESOURCE_LOCAL"

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    lorsque j'ajoute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    transaction-type="RESOURCE_LOCAL"
    j'ai ce message d'erreur lors du déploiement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Command deploy failed : Deploying application in domain failed; The persistence-context-ref-name [sample.SimpleBeanImpl/em] in module [AdeeEar#C:\serveurAppli\glassfish\domains\domain1\applications\j2ee-apps\AdeeEar\SimpleEJBProject_jar] resolves to a persistence unit called [SimpleJPA] which is of type RESOURCE_LOCAL. Only persistence units with transaction type JTA can be used as a container managed entity manager. Please verify your application.

  6. #6
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Ca signifie donc qu'il faut forcément utiliser JTA avec Glassfish. Mais pourtant ton code utilisant JTA a l'air correct

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    Yes !!!! ça marche!!
    en fait, comme un con, je ne regardais pas les logs du server. (je regardais juste l'erreur sur le navigateur (manque d'expérience )

    et par ex: j'ai trouvé ça dans le log

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'informations' cannot be null
    Error Code: 1048
    Call: INSERT INTO GROUPE (PHOTO, EMAIL, NOM, VALIDE, INFORMATIONS) VALUES (?, ?, ?, ?, ?)
    	bind => [null, null, e, null, null]
    j'ai juste rempli correctement mon objet, maintenant ça marche !!!!
    ouffffff !!!

    maintenant que j'ai réussi à faire le lien entre les 3 tiers, je peux désormais m'attaquer à la création du projet

  8. #8
    Membre à l'essai
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Bonjour

    j'essaye de faire la méme chose c'est pour sa que j'ai préférer relancer ce sujet que de crée un nouveau.

    par contre mon problem est dans la configuration j'utilise cette environement

    http://download.java.net/glassfish/eclipse/

    est j'ai telecharger une implementation de JPA ( "EclipseLink 1.1.2 - Galileo" et méme "EclipseLink 1.2.0 - JPA 2.0 Preview" )

    le problem c'est que lorsque je crée un "JPA projet" je n'arrive pas a le déployé , le déploiment automatique comme cellui des projet EJB ou WEB n'est pas proposé , est lorsque je lui crée un "EAR" le EAR ne se déploi pas tout simplement erreur de "java null pointer" .

    si je mélange dans le méme projet les EJB session et entité tout marche biensur , mais moi je veut avoir 3 projet distinct si possible

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

Discussions similaires

  1. WebApp + JPA + EJB + EAR
    Par jecomprendsrien dans le forum Maven
    Réponses: 0
    Dernier message: 06/10/2011, 10h12
  2. [EJB3] JPA, EJB => référence cyclique
    Par olivier57b dans le forum Java EE
    Réponses: 1
    Dernier message: 22/12/2010, 06h19
  3. Réponses: 4
    Dernier message: 29/07/2010, 09h50
  4. [Data] Configuration JTA/JPA/Spring dans Glassfish
    Par kirin dans le forum Spring
    Réponses: 1
    Dernier message: 29/04/2010, 12h28
  5. [EJB] [Stratégie] Exception se baladant à travers JPA & EJB..
    Par slake13 dans le forum Java EE
    Réponses: 5
    Dernier message: 26/02/2009, 10h33

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