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 :

entityManager.persist et transaction


Sujet :

JPA Java

  1. #1
    Invité(e)
    Invité(e)
    Par défaut entityManager.persist et transaction
    Bonjour,

    je m'interroge sur les transactions. J'ai vu au fil de mes lectures deux type de gestion des transactions (corrigez moi si je me trompe)

    on peut utiliser une EntityManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @PersistenceContext(unitName="ToDoEJB3")
    private EntityManager entityManager;
    ou injecter une transaction via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @TransactionManagement(BEAN)
    J'aimerai savoir lorsque l'on utilise un EntityManager, à quel moment peut on faire un rollback ?
    le rollback est automatique ?

    pour tester j'ai fais un entityManager.persist(monObjet) dans un try catch
    puis j'ai généré une erreur de programmation juste apres.

    résultat, il n'y a pas eu persitance des données en base de données !

    y'a t'il eu un rollback ?
    Quand est effectué le commit lorsque l'on utilise un persit ?
    C'est le conteneur qui gère donc la transaction via cet EntityManager ?
    Si c'est le cas, si le conteneur capte une erreur il rollback automatiquement ?

    merci, ça fait beaucoup de questions ^^
    Dernière modification par Invité(e) ; 24/06/2008 à 12h26.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    bon premier élément de réponse il semblerait que l'on ne puisse pas utiliser les deux en même temps car cela me génère une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Illegal to call this method from injected, managed EntityManager
    je tentais un rollback en utilisant une transaction comme suit:

    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
     
    EntityTransaction tx = entityManager.getTransaction();
        		tx.begin();
     
        		Taches tache = new Taches(nom,prenom,commentaire, date);
        		try{
     
    		    	tache.setRefPriorite(entityManager.find(TachesPriorite.class, priorite));
    		    	entityManager.persist(tache);
    		    	System.out.println("Tache créée. nom:"+nom+" prenom:"+prenom+" commentaire:"+commentaire+" date:"+date);
        		}
        		catch(Exception e){
        			System.out.println("priorité inexistante ou null");
        		}
     
        		tx.rollback();
    donc apparement cela est géré par le conteneur...

    mais alors à quoi sert ou plutôt comment se sert on de ceci:
    @TransactionAttribute(TransactionAttributeType.REQUIRED)

    j'ai bien lu ceci:
    http://openejb.apache.org/3.0/transa...notations.html

    mais bon...

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    bon après différents test, je ne comprend effectivement pas comment sont gérées les transactions par le conteneur lorsque l'on utilise un EntityManager.

    mon test:

    une insertion en base de données d'une tache avec une référence existante à une priorité.

    puis insertion d'une tache en base de données avec une référence non existante à une priorité.

    j'ai fais executé les deux requêtes via lemême EntityManager mais séparé dans deux try catch différent et voila le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    16:15:52,937 INFO  [STDOUT] Hibernate: select tachesprio0_.idPriorite as idPriorite1_0_, tachesprio0_.type as type1_0_ from TachesPriorite tachesprio0_ where tachesprio0_.idPriorite=?
    16:15:52,984 INFO  [STDOUT] Hibernate: select nextval ('hibernate_sequence')
    16:15:53,015 INFO  [STDOUT] Tache créée. nom:durant prenom:bob commentaire:ceci est un test date:2008-06-20
     
    16:15:53,015 INFO  [STDOUT] Hibernate: select tachesprio0_.idPriorite as idPriorite1_0_, tachesprio0_.type as type1_0_ from TachesPriorite tachesprio0_ where tachesprio0_.idPriorite=?
    16:15:53,015 INFO  [STDOUT] Hibernate: select nextval ('hibernate_sequence')
    16:15:53,015 INFO  [STDOUT] priorité inexistante ou null
     
    16:15:53,015 INFO  [STDOUT] [CREATE]Temps d execution :0.234ms
    résultat, table tache vide.
    Le premier enregistrement n'a pas été persisté malgré le persist effectué.

    étrange ?

    voila le code de mon test

    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
    42
    43
    44
    45
     
    @PersistenceContext(unitName="ToDoEJB3")
    private EntityManager entityManager;
     
    .....
     
    public void create(String nom, String prenom, String commentaire,Date date,int priorite) {
     
        	long begin = System.currentTimeMillis();
     
        	if(priorite!=0){
     
        		Taches tache = new Taches(nom,prenom,commentaire, date);
        		try{
     
    		    	tache.setRefPriorite(entityManager.find(TachesPriorite.class, priorite));
    		    	entityManager.persist(tache);
     
    		    	System.out.println("Tache créée. nom:"+nom+" prenom:"+prenom+" commentaire:"+commentaire+" date:"+date);
        		}
        		catch(Exception e){
        			System.out.println("priorité inexistante ou null");
        		}
     
        		try{
     
    		    	Taches tache2 = new Taches(nom,prenom,commentaire, date);
    		    	tache2.setRefPriorite(entityManager.find(TachesPriorite.class, 10));
    		    	entityManager.persist(tache2);
     
    		    	System.out.println("Tache créée. nom:"+nom+" prenom:"+prenom+" commentaire:"+commentaire+" date:"+date);
        		}
        		catch(Exception e){
        			System.out.println("priorité inexistante ou null");
        		}
     
        	}
        	else{
        		System.out.println("Veuillez entrer une priorité");
        	}
     
        	long end = System.currentTimeMillis();
        	float time = ((float) (end-begin)) / 1000f;
        	System.out.println("[CREATE]Temps d execution :"+time +"ms");
        }
    comment fonctionne ces transaction gérées par le conteneur ?
    comment est fait ce rollback ?
    pourquoi mes données ne sont pas persistées alors que l epersist suffit d'habitude ?

    merci

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Août 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1
    Par défaut
    C'est pareil, je ne comprends pas pourquoi ca persiste pas, la boucle persist() passe mais rien dans la base de données...as tu trouvé une solution. Environnement Seam JPA chez moi.

    Merci,

    Julien

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    C'est normal que tu ne persistes pas, en fait tu n'as pas délégué la gestion de tes transactions à un framework (genre spring) tu dois donc le gérer manuellement, tu ne persistes pas justement parceque tu n'as pas démarré une transaction et tu n'as pas non plus fait de commit à la fin de ta transaction. voila un 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import java.util.Date;
    import java.util.List;
     
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import javax.persistence.Query;
     
    public class Main {
      static EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAService");
      static EntityManager em = emf.createEntityManager();
     
      public static void main(String[] a) throws Exception {
     
        em.getTransaction().begin();
     
     
        Student student = new Student();
        student.setId(1);
        student.setName("Joe");
        student.setDateOfBirth(new Date());
        student.setGender(Gender.FEMALE);
     
        em.persist(student);
        em.flush();
     
        Student st = em.find(Student.class, student.getId());    
        System.out.println(st);
     
        em.getTransaction().rollback();
     
        em.close();
        emf.close();
     
        Helper.checkData();
      }
    }

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Par défaut Soucis avec les transactions
    Bonjour.
    J'ai lu (avec beaucoup d'attention) et appliqué la gestion des transactions telle que expliquée précédement. Mais j'ai toujours une erreur
    Exception in thread "main" javax.ejb.EJBTransactionRolledbackException: [PersistenceUnit: leReal-entite] Unable to build EntityManagerFactory

    Mon code:
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("leReal-entite");

    EntityManager em = emf.createEntityManager();
    //getManager()
    em.getTransaction().begin();
    if(em.merge(eleve) == null || em.merge(classe) == null){
    em.getTransaction().rollback();
    em.close();
    emf.close();
    return 0;
    }
    Dans le persistence.xml:
    <persistence-unit name="leReal-entite">

    Des suggestions ?????
    Merci

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    L'entity manager est une chose, ensuite, avec quoi tu l'utilises.
    Si c'est dans un EJB stateless, de manière simplifiée, dans la mesure où tu ne paramètre rien de spécial, c'est à la fin de la première méthode appelée que le commit est fait.

    Par contre, via les annotations, tu peux affiner les transactions et, par exemple, dire que la méthode initiale créée une transaction, fait appel à une 2ème méthode qui créera sa propre transaction.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. JPA EntityManager persist() and remove()
    Par aelmalki dans le forum JPA
    Réponses: 2
    Dernier message: 10/08/2011, 16h01
  2. Réponses: 5
    Dernier message: 24/05/2011, 10h27
  3. n EntityManager.persist <-> 1 insert
    Par gontard dans le forum JPA
    Réponses: 11
    Dernier message: 01/07/2010, 12h32
  4. Unité de persistence et transaction-type
    Par anisj1m dans le forum Persistance des données
    Réponses: 5
    Dernier message: 12/10/2009, 10h51
  5. [EJB3 Entity] Usage de persist() en transaction ou sans ?
    Par tiamat dans le forum Java EE
    Réponses: 2
    Dernier message: 17/10/2007, 07h52

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