首先说下Spring和Hibernate的几个特征:
Spring:自动依赖注入,类都可以被当成bean使用。
Hibernate:会话工厂sessionfactory,事务管理器transaction。
如果只使用Hibernate,那么当你操作数据库的时候,需要敲诸如:
Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
然后在session里操作数据库方法,在tx里提交。
但是当你使用Spring,在Spring里配置Hibernate时候,
首先是会话工厂可以被当作一个bean来写入Spring配置文件当中,例如:
<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource”>
<property name=”url” value=”jdbc:jtds:sqlserver://localhost:1433/test”>
</property>
<property name=”driverClassName” value=”net.sourceforge.jtds.jdbc.Driver”>
</property>
<property name=”username” value=”sa”></property>
<property name=”password” value=”123456″></property>
</bean>
<bean id=”sessionFactory” class=”org.springframework.orm.hibernate4.LocalSessionFactoryBean”>
<property name=”dataSource”>
<ref bean=”dataSource” />
</property>
<property name=”hibernateProperties”>
<props>
<prop key=”hibernate.dialect”>
org.hibernate.dialect.SQLServerDialect
</prop>
</props>
</property>
<property name=”mappingResources”>
<list>
<value>com/domain/Users.hbm.xml</value>
</list>
</property>
</bean>
在sessionfactory这个bean里配置数据源和各种属性。当然这个类是Spring包中的,是Spring提供的功能。
然后,Spring同样也可以以bean方式提供给Hibernate一个事务管理器,例如:
<bean id=”transactionManager”
class=”org.springframework.orm.hibernate4.HibernateTransactionManager”>
<property name=”sessionFactory” ref=”sessionFactory” />
</bean>
<tx:annotation-driven transaction-manager=”transactionManager” />
然后是事务拦截器,将事务管理器的bean注入其中,例如:
<bean id=”transactionInterceptor”
class=”org.springframework.transaction.interceptor.TransactionInterceptor”>
<!– 事务拦截器bean需要依赖注入一个事务管理器 –>
<property name=”transactionManager” ref=”transactionManager” />
</bean>
再是可以自动生成业务代理的bean,这个bean将使用事务拦截器,例如:
<!– 定义BeanNameAutoProxyCreator –>
<bean
class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>
<!– 指定哪些bean自动生成业务代理 –>
<property name=”beanNames”>
<!– 下面是所有需要自动创建事务代理的bean –>
<list>
<value>mgr</value>
</list>
<!– 此处可增加其他需要自动创建事务代理的bean –>
</property>
<!– 下面定义BeanNameAutoProxyCreator所需的事务拦截器 –>
<property name=”interceptorNames”>
<list>
<!– 此处可增加其他新的Interceptor –>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
那么,我们在其中写的自动创建事务代理的id为mgr的bean是这样的:
<bean id=”mgr” class=”com.service.impl.ActionManagerImpl”>
<property name=”usersDAO” ref=”usersDAO” />
</bean>
其中,usersDAO会被自动注入。
我们在usersDAO里不需要像之前要创建配置、会话工厂、事务这么复杂,只需要用getCurrentSession()下的各种方法就可以了。会帮你自动获取当前会话。
配置起来过程会略多,但是总体写的代码绝对比单独用hibernate然后在DAO类里写的代码要少。