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 :

[Spring][Transaction] Multiple DAO


Sujet :

Spring Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut [Spring][Transaction] Multiple DAO
    Bonjour à tous,

    J'ai des petits soucis avec les transactions et spring... Je vous explique:

    J'ai cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Service("calendrierBR")
    public class CalendrierBRImpl implements ICalendrierBR {
    	/**
             * Logger for this class
             */
    	private static final Logger logger = Logger
    			.getLogger(CalendrierBRImpl.class);
     
    	@Resource
    	private ITacheDAO tacheDAO;
    	@Resource
    	private IActiviteDAO activiteDAO;
    Et j'ai dans cette classe une méthode transactionnelle:

    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
     
    @Transactional
    public void insert(Activite activite, double jourAInserer, Date parse) {
     
    	[...]
    	activite = activiteDAO.save(activite);
     
    	while (jourAInserer > 0) {
    	   for (short i = 1; i <= 4; i++) {
    	      [...]
    	      tacheDAO.findTache([...]);
     
    	      [...]
    	      tacheDAO.save([...]);
     
    	   }
    	}
    }
    Mes DAO sont comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Repository
    public class ActiviteDAO implements IActiviteDAO{
     
    	@PersistenceContext(type = PersistenceContextType.EXTENDED)
    	private EntityManager entityManager;
    Je pensais que lorsqu'on déclarait une méthode transactionnelle, tous les dao que l'on utilise à l'intérieur de celle ci partage la même transaction, et donc la même session... Hors ce n'est pas le cas. Je le vois d'ailleurs au niveau des log:
    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
    DEBUG - [CalendrierBRImpl] -> insertion des taches
    DEBUG - [ActiviteDAO] -> saving Activite instance
    DEBUG - [SessionImpl] -> opened session at timestamp: 12380808097
    DEBUG - [JDBCTransaction] -> begin
    DEBUG - [ConnectionManager] -> opening JDBC connection
    DEBUG - [DriverManagerDataSource] -> Creating new JDBC DriverManager Connection to [jdbc:postgresql://localhost/suiviactivite]
    DEBUG - [JDBCTransaction] -> current autocommit status: true
    DEBUG - [JDBCTransaction] -> disabling autocommit
    DEBUG - [ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler] -> Starting resource local transaction on application-managed EntityManager [org.hibernate.ejb.EntityManagerImpl@1f7dbd8]
    DEBUG - [ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler] -> Joined local transaction
    
    [...]
    
    DEBUG - [BatchingBatcher] -> Executing batch size: 1
    DEBUG - [AbstractBatcher] -> about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    DEBUG - [ActiviteDAO] -> persist successful
    DEBUG - [TacheDAO] -> findTache
    DEBUG - [SessionImpl] -> opened session at timestamp: 12380808100
    DEBUG - [JDBCTransaction] -> begin
    DEBUG - [ConnectionManager] -> opening JDBC connection
    
    [...]
    On le voit bien... il fait deux fois un begin. Il ne devrait le faire qu'une seule fois, non ?!

    Je pense que cela vient d'une mauvaise configuration de ma part... Pouvez-vous m'aider ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Petites précisions, je récupère mon service dans une action Struts comme ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ICalendrierBR calBR = (ICalendrierBR) getWebApplicationContext().getBean("calendrierBR");
    Et le web.xml contient ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>

  3. #3
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,
    Mets @Transactional sur les méthodes de tes services plutôt, qui eux appellent les DAOs. Comme ça, le tout serait exécuté dans une seule transaction.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Salut djo.mos,
    merci de ta réponse.

    Cependant, c'est ce qui est fait actuellement...


  5. #5
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Citation Envoyé par DeathMaker Voir le message
    Cependant, c'est ce qui est fait actuellement...

    Oups Pardon, j'ai lu/répondu un peu trop vite.

    A tout hasard (ce serait trop simple ) , est ce que tu as mis @Transactional (avec propagation en requires new) dans les DAOs ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Il faut mettre @Transactional dans les DAOs ?!

    J'vais essayer...

    Mais je mettais inspirer de ce billet, où il n'y a pas ces annotations dans les DAOs -_-

    http://blog.developpez.com/djo-mos/p...ge-par-spring/

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    Oups Pardon, j'ai lu/répondu un peu trop vite.

    A tout hasard (ce serait trop simple ) , est ce que tu as mis @Transactional (avec propagation en requires new) dans les DAOs ?
    Je me disais bien, pourquoi est ce que les DAO devraient être @Transactional !
    Ici même (http://www.developpez.net/forums/d57...n/#post3415477) tu dis que les transactions se limite à la couche service...

    Du coup, je suis toujours bloqué

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Je viens de changer la structure de mes DAO pour bosser avec des sessionsFactory:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	@Autowired
    	private SessionFactory sessionFactory;
    Ca passe maintenant... Mais ça me dérange un peu, j'aurai voulu faire du full JPA :'(

  9. #9
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Citation Envoyé par DeathMaker Voir le message
    Je me disais bien, pourquoi est ce que les DAO devraient être @Transactional !
    Ici même (http://www.developpez.net/forums/d57...n/#post3415477) tu dis que les transactions se limite à la couche service...

    Du coup, je suis toujours bloqué
    Non non, il y'a eu un malentendu : quand je te demandais si t'avas anooté les DAOs par @Transactional, c'était dans le sens ou c serait une erreur, pas que c'était ce qu'o fallait faire.

Discussions similaires

  1. spring configuration multiple
    Par austin P. dans le forum Spring
    Réponses: 4
    Dernier message: 11/06/2009, 13h55
  2. [Data] Spring, transactions et threads
    Par cecile_31 dans le forum Spring
    Réponses: 8
    Dernier message: 16/07/2008, 13h47
  3. Transactions multiples sous mysql
    Par pitchoune62 dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/08/2006, 11h56
  4. Réponses: 1
    Dernier message: 12/06/2006, 19h02
  5. [ spring ] transaction tomcat
    Par hocinema dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 11/10/2005, 21h04

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