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
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
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 –