使用SPRING+HIBERNATE 控制事務

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

    }

}
發佈了35 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章