Nelle lezioni precedenti abbiamo accennato alla transazionalità delle operazioni, senza però specificare quale componente la implementasse.
Transaction Manager
Responsabile delle transazioni è il TransactionManager
, un componente in grado di creare e gestire le transazioni attraverso un datasource e al cui utilizzo si affida HibernateTemplate
.
Spring fornisce diversi transaction manager, uno per ogni tecnologia ORM supportata. Nel caso preso in esempio quello da utilizzare è il HibernateTransactionManager
in grado di operare tramite una session factory.
Oltre al transaction manager occore anche specificare, attraverso il tag tx:annotation-driven
che le direttive di transazione vengono fornite attraverso l'utilizzo di annotations.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- ... -->
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- ... -->
</beans>
Hibernate Template
Passiamo ora alla configurazione del template hibernate discusso in precedenza
<!-- ... -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- ... -->
</beans>
Book Dao
A questo punto l'ultimo bean rimasto da configurare è semplicemente quello rappresentate l'implementazione specifica del Book Dao.
<!-- ... -->
<bean id="bookDao" class="it.html.spring.book.BookHibernateDaoSupport">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<!-- ... -->
</beans>
In caso di utilizzo della classe HibernateDaoSupport
è possibile iniettare nel BookDao
direttamente un TransactionManager
rendendo di fatto inutile configurare HibernateTemplate
. Sarà poi la stessa classe di supporto responsabile di istanziare un oggetto di tipo HibernateTemplate
.