Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 252
    Points : 8 907
    Points
    8 907

    Par défaut Le @Transactional fonctionne au niveau DAO mais pas Service

    Bonjour à tous,

    J'ai un petit bug que je ne comprend pas.

    Mon appli possède trois couche : Web, Service et DAO.

    Quand je mets le @Transactional dans mon service, ça ne marche pas :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Service
    class MonService 
     
      @autowired
      private ChienDao chienDao;
     
      @Transactional
      public void createMonChien(String name) {
        Chien chien = new Chien(name);
        chienDao.save(chien);
      }
    et
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Repository
    class ChienDao {
     
      @PersistenceContext
      private EntityManager entityManager;
     
     
      public void save(Chien chien) {
        entityManager.persist(chien);
      }
    Par contre, quand je mets le @Transactional dans le DAO (et que je l'enlève du service), ça marche :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Service
    class MonService 
     
      @autowired
      private ChienDao chienDao;
     
      //@Transactional
      public void createMonChien(String name) {
        Chien chien = new Chien(name);
        chienDao.save(chien);
      }
    et
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Repository
    class ChienDao {
     
      @PersistenceContext
      private EntityManager entityManager;
     
      @Transactional     // la ca marche
      public void save(Chien chien) {
        entityManager.persist(chien);
      }
    Donc je ne comprend pas.
    J'aurais tendance à penser que ma config est bonne puisque ça marche quand je mets l'annotation dans le DAO...
    Thierry Leriche-Dessirier
    Ingénieur Architecte JEE Freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
    Site : http://www.icauda.com
    Linked'in : http://www.linkedin.com/in/thierryler
    Twitter : http://www.twitter.com/thierryleriche

  2. #2
    Expert Confirmé
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 384
    Points : 2 888
    Points
    2 888

    Par défaut

    Un problème de configuration du
    Code :
    <context:component-scan ...
    peut-être ?

  3. #3
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 252
    Points : 8 907
    Points
    8 907

    Par défaut

    Dans mon applicationContext.xml, j'ai mis :

    Code :
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans ...>
    	<context:component-scan base-package="com.masociete.monprojet" />
     
    	<import resource="db.xml" />
    	...
    mon db.xml :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans ... default-autowire="byName">
     
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    		<property name="persistenceUnitName" value="MyBoPU" />
    	</bean>
     
    	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    	<tx:annotation-driven />
     
    	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    </beans>

    et MonService est bien dans un package qui va bien (je crois) :
    Code :
    1
    2
    3
     
    package com.masociete.monprojet.service.foo;
    ...
    Et puis, ça fonctionne quand je met l'annotation dans le DAO...
    Thierry Leriche-Dessirier
    Ingénieur Architecte JEE Freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
    Site : http://www.icauda.com
    Linked'in : http://www.linkedin.com/in/thierryler
    Twitter : http://www.twitter.com/thierryleriche

  4. #4
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 252
    Points : 8 907
    Points
    8 907

    Par défaut

    Pour info, j'ai trouvé ce qui emperchait mon code de fonctionner. Je crois que je comprend vaguement pourquoi mais ça reste flou.

    En gros, pour que l'annotation fonctionne, il faut la placer sur une méthode appelée par un composant directement.

    Dans mon cas, je faisais :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    @Service
    class MonService 
     
      @autowired
      private ChienDao chienDao;
     
      @Transactional
      public void createMonChien(String name) {
        Chien chien = new Chien(name);
        chienDao.save(chien);
      }
     
      public void appel() {
        createMonChien("milou");
        ...
      }
    et j'ai un composant qui appelle ça depuis la couche Web :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Component
    public class MonManager {
     
      @autowired
      private MonService monService;
     
      public String foo() {
        monService.appel();
        ...
      }
     
    }
    En fait, ça marche si c'est carrément foo() que j'annote :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    @Service
    class MonService 
     
      @autowired
      private ChienDao chienDao;
     
      //@Transactional
      public void createMonChien(String name) {
        Chien chien = new Chien(name);
        chienDao.save(chien);
      }
     
      @Transactional
      public void appel() {
        createMonChien("milou");
        ...
      }
    Thierry Leriche-Dessirier
    Ingénieur Architecte JEE Freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
    Site : http://www.icauda.com
    Linked'in : http://www.linkedin.com/in/thierryler
    Twitter : http://www.twitter.com/thierryleriche

  5. #5
    Membre éprouvé
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    janvier 2005
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 356
    Points : 423
    Points
    423

    Par défaut

    Salut
    Mais est ce que tu pense pas que l'annotation de transaction n'a finalement pas de raison d’être sur le DAO, mais uniquement sur le service, quelque part ce te donne des DAO qui peuvent se passer d'import spring puisque @Repository("monDao") peut etre remplacé par un @Named("monDao") et devenir facilement des ejb et le sous classant et en décorant la sous classe par un @Stateless ou un @transactionnal pour un pojo spring et en plus si tu annote ton DAO avec un @Default et créer un qualifier l'injection style CDI est effective avec le conteneur IoC spring avec un minimum de xml puisque component scan ainsi injecter ton DAO dans ton service spring
    Enfin je dis ça, c'est juste histoire de papoter

  6. #6
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 252
    Points : 8 907
    Points
    8 907

    Par défaut

    Au départ j'ai mis ça dans les DAO pour aller vite, en gardant en tête de les mettre dans les services, ce qui est fait maintenant.

    Pour tout dire à propos de CDI. Quand j'ai commencé le projet, je voulais faire du seam 3 mais je n'ai pas réussi à faire tout ce que je voulais. Je précise que je suis sous Tomcat. J'ai abandonné cette idée, heureusement. Ensuite je me suis limité à Weld et j'étais assez content. Mais après j'ai investi pas mal d’énergie sur Spring-security avec ldap/base/rechargement de droits/etc. Du coup je me suis contenté de spring + spring-security et j'ai viré Weld.

    Mais je suis à la recherche d'une bonne solution pour remplacer mon couple spring/spring-security par quelque chose utilisant CDI...

    Je suis aussi preneur d'un candidat pour remplacer JSF2/pretty-faces/prime-faces, qui irait avec le nouveau couple CDI
    Thierry Leriche-Dessirier
    Ingénieur Architecte JEE Freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
    Site : http://www.icauda.com
    Linked'in : http://www.linkedin.com/in/thierryler
    Twitter : http://www.twitter.com/thierryleriche

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •