使用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);
}
});
}
}