使用Spring集成Hinernate
按照從下向上方法建立
1.Hibernate對應的Dao層集成HibernateDaoSupport這個類,這個類是 Spring對Hibernate的集成,該類需要使用Spring向其注入sessionFactory代碼如下getHibernateTemplate()注意利用回調的方法,匿名類對HibernateTemplate完成callback調用,注意聲明其事務屬性爲本地
<property name="current_session_context_class">Thread</property>
2.對Spring進行配置,首先將Dao交給Spring管理,將sessionFactory注入其中
<bean id="userDao" class="com.houlu.drp.usermgr.dao.impl.UserDao4SqlServerImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
3.對Spring進行配置,將Service交給Spring管理,將dao注入org.springframework.orm.hibernate3.LocalSessionFactoryBean類的
configLocation屬性中,得到Hibernate的sessionFactory,該對象可以用在多處
<bean id="userService" class="com.houlu.drp.usermgr.service.impl.UserService4SpringImpl">
<property name="userDao" ref="userDao"/>
</bean>
4.對Spring進行配置,配置事務,Spring針對Hibernate實現了事務管理器,需要將sessionFactory注入到事務管理器內,同時利用AOP的方法配置事務的管理
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 那些類那些方法使用事務 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.houlu.drp.usermgr.service.impl..*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
<!-- 事務的傳播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
對應Dao層代碼如下
package com.houlu.drp.usermgr.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.houlu.drp.usermgr.dao.UserDao;
import com.houlu.drp.usermgr.domain.User;
import com.houlu.drp.utils.PageModel;
public class UserDao4SqlServerImpl extends HibernateDaoSupport implements UserDao {
@Override
public void addUser(User user) {
getHibernateTemplate().save(user);
}
@Override
public void delUser(String[] userIds) {
for(int i=0;i<userIds.length;i++){
User user = (User)getHibernateTemplate().load(User.class, userIds[i]);
getHibernateTemplate().delete(user);
}
}
@Override
public void modifyUser(User user) {
getHibernateTemplate().update(user);
}
@Override
public User findUserById(String userId) {
return (User)getHibernateTemplate().get(User.class, userId);
}
@Override
public PageModel findUserList(final int pageNo, final int pageSize) {
// Query query = session.createQuery("from User")
// .setFirstResult((pageNo-1)*pageSize)
// .setMaxResults(pageSize);
// List list = query.list();
// PageModel pageModel = new PageModel();
// pageModel.setList(list);
// pageModel.setPageNo(pageNo);
// pageModel.setPageSize(pageSize);
// int totalPages = (int)((getTotalRecords(session)+pageSize-1)/pageSize);
// pageModel.setTotalPages(totalPages);
List userList = getHibernateTemplate().executeFind(new HibernateCallback() {
@Override
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery("from User")
.setFirstResult((pageNo - 1) * pageSize)
.setMaxResults(pageSize);
return query.list();
}
});
PageModel pageModel = new PageModel();
pageModel.setList(userList);
pageModel.setPageNo(pageNo);
pageModel.setPageSize(pageSize);
int totalPages = (int)((getTotalRecords()+pageSize-1)/pageSize);
pageModel.setTotalPages(totalPages);
return pageModel;
}
private long getTotalRecords(){
// return (Long) session.createQuery("select count(*) from User").list().get(0);
return (Long)getHibernateTemplate().execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
return (Long) session.createQuery("select count(*) from User").list().get(0);
}
});
}
}