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

Spring Java Discussion :

@Transactional et JDBC [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut @Transactional et JDBC
    Salut à tous.
    J'essaye de comprendre le fonctionnement des transactions déclaratives dans Spring par l'intermédiaire de l'annotation @Transactional.
    J'ai parcourus la doc sur le sujet ici ainsi que plusieurs tutos et j'ai toujours la même interrogation.
    Admettons que j'ai les fichiers on ne peut plus classiques suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      <bean id="fooService" class="x.y.MaClasse"/>
      <tx:annotation-driven transaction-manager="txManager"/>
     
      <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
      </bean>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Transactional
    public class MaClasse implements MonInterface {
     
      Truc getTruc() {
          ...
       }
    }
    Ma question est la suivante: mais bon sang dans le corps de ma méthode par quel tour de magie est-ce que j'obtiens un JdbcTemplate ou tout autre moyen d'accéder à ma base de données, ce qui est la seule et unique utilité ???

    Bon, voila, c'est très con mais ça fait deux heures que je cherches et je ne trouve pas, si quelqu'un pouvait m'aider je lui dis merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    Ma question est la suivante: mais bon sang dans le corps de ma méthode par quel tour de magie est-ce que j'obtiens un JdbcTemplate ou tout autre moyen d'accéder à ma base de données, ce qui est la seule et unique utilité ???
    C'est très simple, il suffit de l'injecter dans ton service, par exemple, en utilisant une SessionFactory hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <context:annotation-config />
    <context:component-scan base-package="x.y" />
     
    <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            ...
    </bean>
    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
     
    @Transactional
    @Service
    public class MaClasseService implements MonInterface {
     
      @Autowired
      private MaClasseDao maClasseDao;
     
      public long countLesX() {
         return maClasseDao.countLesX();
      }
    }
     
    @Repository
    public class MaClasseDaoImpl implements MaClasseDao {
     
      // Injection de la session factory, idem avec JdbcTemplate
       @Autowired
      private SessionFactory sessionFactory;
     
      public long countLesX() {
        Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(X.class);
       criteria.setProjection(Projections.rowCount());
       return ((Integer) criteria.uniqueResult()).longValue();
      }
     
    }
    Je n'utilise jamais JDBC mais c'est casi la même chose apparement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <context:annotation-config />
    <context:component-scan base-package="x.y" />
     
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource" />
            ...
    </bean>
    Voilà, bonne chance.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Ca ne répond pas du tout à ma question mais merci d'avoir essayé
    En fait j'ai fini par trouver tout seul.

    De mon point de vue, il m'était impossible d'injecter mon datasource directement, parce que ça n'aurait rien changé au fait que j'allais utiliser sa méthode getConnection() qui crée une nouvelle transaction au lieux d'utiliser celle que le transaction manager initialise.
    En fait, après moult lecture de javadoc, il semblerait qu'il existe une méthode statique DataSourceSupport.getConnection(DataSource) qui doit être utilisé pour cela. Si un transaction manager est lié au thread courant il récupère la connection en cours, sinon il en demande une nouvelle au datasource. Comme cette méthode est systématiquement appelée par JdbcTemplate on peut aussi se contenter d'utiliser cette classe pour le même résultat.
    C'était pas franchement bien indiqué dans la doc de Spring, pas bien ça.

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

Discussions similaires

  1. [EJB MDB] Transaction et JDBC
    Par MrCba dans le forum Java EE
    Réponses: 0
    Dernier message: 27/02/2009, 10h06
  2. [Hibernate 3.0] Erreur JDBC lors de transaction
    Par julienOriano dans le forum Hibernate
    Réponses: 2
    Dernier message: 06/07/2006, 12h23
  3. Réponses: 5
    Dernier message: 24/08/2005, 11h21
  4. [JDBC] probleme avec les transactions
    Par lthomas dans le forum JDBC
    Réponses: 2
    Dernier message: 17/06/2005, 17h10
  5. [JDBC][Access] Transaction SQL sur MS Access?
    Par Twofy dans le forum JDBC
    Réponses: 2
    Dernier message: 19/08/2004, 14h46

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