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

    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值