2012-07-04 4 views
2

Peut-être que le titre est un peu trompeur mais je voudrais vous demander un conseil.printemps mvc hibernate bonne façon de gestion des transactions

Maintenant, disons que j'ai configuré mon application Spring mvc avec hibernate et transactions. Une partie de la configuration ressemble à ceci:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/> 
    <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> 
    <property name="user" value="xxx"/> 
    <property name="password" value="xxx"/> 
    <property name="maxPoolSize" value="10"/> 
    <property name="maxStatements" value="0"/> 
    <property name="minPoolSize" value="5"/> 
</bean> 
<!-- Session Factory Declaration --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
    <property name="packagesToScan" value="com.execon.models"/> 
</bean> 

<!-- Enable the configuration of transactional behavior based on annotations --> 
<tx:annotation-driven transaction-manager="txManager"/> 

<!-- Transaction Manager is defined --> 
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

Donc, fondamentalement, ce que je dois faire maintenant, est juste @Autowired mon sessinFactory à la classe qui va gérer le droit d'accès DB?

Un exemple rapide, bien que son avec @Controller, je vais passer à @Service:

@Resource(name = "sessionFactory") 
private SessionFactory sessionFactory; 

@RequestMapping(value = "/") 
public String getMainPage(Model model) 
{ 
    Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    Query query = session.createQuery("from Period"); 
    List<Period> list = query.list(); 
    System.out.println(list); 
    session.getTransaction().commit(); 
    return "MainPage"; 
} 

Comme vous pouvez le voir, je suis juste essayer de mettre sur la liste de la console std d'une classe mappée. Cela fonctionne très bien, mais j'ai besoin d'un conseil pour savoir comment cela devrait être géré dans un plus grand projet. Dois-je avoir une classe util qui obtient la session et commence la transaction? Ou devrais-je utiliser des modèles pour gérer cela? Simplement, je ne veux pas écrire ceci:

Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    // 
    //... 
    // 
    session.getTransaction().commit(); 

Dans chaque endroit où je dois me connecter à DB. Peut-être que je manque quelque chose, ou que je le fais complètement faux? Toute aide serait appréciée

Répondre

3

Le bit qui vous manque est celui des annotations de transaction de printemps. De toute évidence, comme vous l'avez souligné, la chose normale est de séparer le matériel de base de données.

Dans votre contexte fichier, vous devez:

<tx:annotation-driven transaction-manager="txManager" /> 

Remarque dans cet exemple spécifique, vous aurez besoin de mettre cela dans le fichier de contexte XXX-servlet.xml parce que c'est la chose qui est la configuration du contrôleur.

L'idée générale avec spring et hibernate est d'utiliser le ressort pour la gestion des transactions et des connexions. L'utilisation de SessionFactoryUtil enregistre la session hibernate en tant que ressource de transaction liée au thread en cours.

+0

Se il vous plaît dire si je comprends bien: 1er Q: '@ Transactional' avec la portée de classe signifie que TOUTES les méthodes dans cette classe seront traitées avec droit de transaction? 2ème Q: Est-ce une mauvaise chose que j'ai faite, en faisant mon POJO (classe de période) '@ Transactional'? 3ème Q: est 'getSession()' du paquet 'org.springframework.orm.hibernate3' égal à' openSession() 'du paquet' org.springframework.orm.hibernate4'? – kamil

+0

Q1 oui .. vous pouvez définir l'ensemble de la classe sur transactionnel ... puis affiner sur chaque méthode. Q2 pas particulièrement faux .. tout le point du printemps est d'utiliser POJO, ce n'est pas un grand style pour rendre les méthodes d'un contrôleur transactionnel, mais pour un petit projet, l'enfer si vous pouvez le tester. Q3 oui c'est pareil .. désolé n'a pas ramassé sur le nom du paquet hibernate4 ... mettra à jour la réponse –

Questions connexes