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 :

No Hibernate Session bound to thread, ejb3 stateless et Spring [Integration]


Sujet :

Spring Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut No Hibernate Session bound to thread, ejb3 stateless et Spring
    Bonjour,

    J'ai un soucis depuis cette après-midi avec une session Hibernate récalcitrante.

    J'explique mon problème :

    j'ai un ejb3 stateless déployé sur un serveur jBoss qui se voit injecter un dao via Spring.


    Voici une partie de l'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
     
    @Stateless(name="projetManager")
    @Interceptors(SpringBeanAutowiringInterceptor.class)
    @Transactional (propagation=Propagation.REQUIRED)
    public class ProjetManagerBean implements ProjetManagerRemote, ProjetManagerLocal {
     
    	@Autowired
    	@Qualifier("projetDao")
    	private ProjetManagerDao projetDao;
     
    	public void addProjet(String param) {
    		projetDao.addProjet(param);
    	}
     
    }
    Voici le Dao en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class ProjetManagerDaoImpl extends HibernateTemplate implements ProjetManagerDao {
     
    	public void addProjet(String param) {
     
    		Projet p = new Projet(param);
     
    		getSessionFactory().getCurrentSession().persist(p);
    	}
     
    }
    Voici la configuration Spring pour injecter le dao dans l'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
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    	<bean id="projetDaoTransaction"
    		class="fr.lewolf.travelmate.service.dao.impl.ProjetManagerDaoImpl">
    		<property name="sessionFactory">
    			<ref bean="sessionFactory" />
    		</property>
    	</bean>
     
    	<!-- sessionFactory  -->
    	<bean id="sessionFactory"
    		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="configLocation">
    			<value>classpath:hibernate.cfg.xml</value>
    		</property>
    		<property name="configurationClass">
    			<value>org.hibernate.cfg.AnnotationConfiguration
    			</value>
    		</property>
    	</bean>
     
    	<bean id="transactionManager"
    		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="sessionFactory" />
    	</bean>
     
    	<bean id="transactionProxy" abstract="true"
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager">
    			<ref bean="transactionManager" />
    		</property>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="insert*">PROPAGATION_REQUIRED</prop>
    				<prop key="update*">PROPAGATION_REQUIRED</prop>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="*">PROPAGATION_REQUIRED, readOnly
    				</prop>
    			</props>
    		</property>
    	</bean>
     
    	<bean id="projetDao" parent="transactionProxy">
    		<property name="target">
    			<ref bean="projetDaoTransaction" />
    		</property>
    		<property name="transactionAttributeSource">
    			<bean
    				class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
    		</property>
    	</bean>
    Tout me parait bien configuré seulement, lorsque j'invoque la méthode de l'ejb pour ajouter un projet, cette exception m'est retrounée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Caused by: org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    	at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
    	at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:544)
    	at fr.lewolf.travelmate.service.dao.impl.ProjetManagerDaoImpl.addProjet(ProjetManagerDaoImpl.java:14)
    	at fr.lewolf.travelmate.service.metier.impl.ProjetManagerBean.methodeTest(ProjetManagerBean.java:26)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
     
    ....
    Au début je pensais que le bean "sessionFactory" n'était pas injecté dans le dao mais lorsque je débug l'invocation, la sessionFactory est bien renseignée. Ce n'est que lorsque j'invoque la méthode "getSessionFactory().getCurrentSession()" que l'exception m'en retournée, sûrement par de l'aop d'ailleurs.

    J'ai cherché de l'aide sur les forums mais toutes les solutions partielles que j'ai trouvées ne m'ont pas aidé à résoudre mon problème.

    Connaîtriez-vous l'origine de ce problème et avez-vous une solution pour le résoudre ?

    Je vous remercie d'avance.

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Points : 157
    Points
    157
    Par défaut
    Alors là, injecter un bean Spring dans un EJB, tu cherches les ennuis aussi :-)

    C'est la première fois que je vois faire ça!!

    A mon avis l'injection doit bien marcher, par contre la session Hibernate est normalement en threadLocal. Or, à mon avis, tes EJBs tournent dans leur propre pool de thread, ce qui fait qu'ils ne "voient" pas la session Hibernate.

    J'ai aussi l'impression que tu utilises Spring pour gérer les transactions : tu n'as pas de problème de ce côté là? C'est le même type de soucis, et je vois mal comment les transactions peuvent se propager dans les EJBs.

    Spring s'intègre parfaitement avec les EJBs (il y a même un namespace pour aider), par contre l'inverse me parait un peu plus compliqué (même si cela semble supporté).

    Franchement, tu es forcé d'avoir des EJBs dans ton appli? Ca serait quand même nettement plus simple de les remplacer par des Beans Spring, d'autant que les EJBs stateless ce n'est pas d'une utilité folle.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    oui, c'est vrai qu'il y a un choix à faire là :
    - soit utiliser les EJB 3 (session + entity) avec le (très bon) conteneur JBoss qui utilise Hibernate comme implémentation JPA
    - soit utiliser le (non moins bon) framework Spring et le configurer pour qu'il s' intègre avec Hibernate et gère les transactions

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Je vais vous expliquer pourquoi je voudrais utiliser cette architecture :

    Premièrement pour avoir un composant partagé, grâce a l'ejb stateless, qui n'est déployé qu'une seule fois et qui peut être invoqué par plusieurs applications (web ou client riche).

    Deuxièmement, je veux utiliser l'implémentation jpa d'hibernate et non celle de ejb3 pour bénéficier de la couche Hibernate Search qui permet d'indexer les entités, chose que ne permet pas de faire jpa ejb3 nativement (apparemment).

    Le deuxième point qui me fait choisir le jpa d'hibernate rejoint le premier point. C'est la possibilité de créer des requêtes dynamiques à la fois sur l'index et sur les attributs des entités à partir de la recherche par criteria.

    Je pense qu'en utilisant la recherche de jpa ejb3, ce sera beaucoup plus difficile.

    Je me suis documenté sur internet et apparemment il n'est pas encore possible d'utiliser hibernate search et la recherche par criteria avec l'implémentation ejb3.

    Pouvez-vous me confirmer cela et si vous voyez une meilleure solution, elle est la bienvenue.


    Je vous remercie d'avance.

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Points : 157
    Points
    157
    Par défaut
    Pour le premier point, tu peux faire cela sans souci avec le support du remoting de Spring. Tu peux bien entendu faire du RMI, mais également utiliser HTTP, Hessian, etc etc. Le tout en gardant un JavaBean normal, uniquement via la conf Spring.
    Bref, tu auras un vrai JavaBean, et en plus tu le choix avec encore plus de protocoles (certains plus performants, etc...).

    Pour ce qui est du 2ème point : chez SpringSource, nous recommandons généralement d'utiliser l'API JPA. Quand je dis JPA, c'est du JPA "normal", pas le système de template Spring (qui est présent pour des raisons de cohérence avec les autres systèmes, mais qui n'est pas recommandé).
    Bref, tu peux parfaitement utiliser avec Spring :
    - JPA avec l'implémentation Hibernate
    - Hibernate directement
    Pour les deux, Spring te propose un certain nombre d'aides, pour mieux gérer les transactions par exemple.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/09/2011, 09h49
  2. [Data] Erreur: No Hibernate Session bound to thread
    Par slanbuas dans le forum Spring
    Réponses: 5
    Dernier message: 23/06/2011, 17h37
  3. No Hibernate Session bound to thread
    Par manu11 dans le forum Spring Web
    Réponses: 3
    Dernier message: 01/10/2009, 09h17
  4. Réponses: 5
    Dernier message: 29/09/2009, 18h56
  5. [Hibernate] Session & Objets persistants
    Par Gob4 dans le forum Hibernate
    Réponses: 3
    Dernier message: 22/05/2006, 14h13

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