2011-06-21 6 views
3

J'ai lu sur l'utilisation de Spring avec Hibernate et je suis vraiment confus au sujet de la gestion de session. J'espère que quelqu'un peut effacer quelques choses pour moi,Spring + gestion de session Hibernate

Tout d'abord, je n'ai aucune idée de la façon dont les sessions sont gérées lors de l'utilisation de HibernateTemplate. Une session est ouverte et fermée lorsque vous appelez une méthode, par exemple Enregistrer() sur le modèle? Lorsque vous utilisez la méthode find(), les objets détachés sont-ils renvoyés?

J'ai lu la section Spring sur les transactions mais elle parle surtout de la gestion des exceptions. J'espérais trouver un moyen de lier une session Hibernate à une transaction Spring afin que je puisse valider les changements d'objets Hibernate lorsque la transaction se termine. Y a-t-il un moyen d'y parvenir?

Répondre

2

Spring gère la session pour vous. En regardant dans le documentation, en particulier dans la section 13.3.1, vous voyez

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="mappingResources"> 
     <list> 
     <value>product.hbm.xml</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <value> 
     hibernate.dialect=org.hibernate.dialect.HSQLDialect 
     </value> 
    </property> 
    </bean> 

puis à la section 13.3.3 vous voyez ce

<bean id="transactionManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

Si vous regardez attentivement, vous verrez que l'usine de la session utilise la source de données, et le gestionnaire de transactions utilise la sessionfactory, de telle sorte que Spring puisse obtenir vos sessions pour vous et envelopper tout votre code de persistance dans une transaction.

+0

Ce n'est pas très clair sur ce qui se passe réellement. Si ce gestionnaire de transactions est utilisé pour une méthode particulière, cela signifie-t-il que tous les accès à la base de données à l'intérieur de cette méthode auront lieu dans la même session d'hibernation? Si je charge un objet Hibernate à l'intérieur de cette méthode, les modifications seront-elles validées à la fin de la méthode? – toc777

+0

@toc le gestionnaire de transactions est toujours utilisé. En fonction de la manière dont vous spécifiez les méthodes à protéger, il fera différentes choses. La session se vide automatiquement avant d'être fermée. Hibernate gère ça, pas Spring. Vous devriez vérifier le filtre opensessioninview. – hvgotcodes

+0

@toc, si vous voulez savoir comment cela fonctionne, je vous suggère de télécharger la source, puis utilisez votre débogueur pour parcourir votre code. – hvgotcodes

Questions connexes