开发者社区 问答 正文

spring3.2整合hibernate4.2事物管理问题求助,在线等~~~

我使用的是spring3.2与hibernate4.2整合,写了个baseDao供其他dao继承。在spring.xml配置文件中将sessionFactory注入给我的baseDao,现在的问题就是我每次增删改都得在baseDao里获取Transaction开事物提交事物,我想把事物管理提取出去改怎么在spring配置文件中写呢?求助!!!

public boolean upload(Object object) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getCurrentSession();
        Transaction tran = session.getTransaction();
        tran.begin();
        session.update(object);
        tran.commit();
        return true;
    }

展开
收起
a123456678 2016-03-16 09:24:09 1959 分享 版权
1 条回答
写回答
取消 提交回答
  • spring配置文件的定义: 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
    <ref local="sessionFactory" /> 
    </property> 
    </bean>
    <!-- 利用spring的AOP功能,即面向切面的编程,来配置事务  --> 
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
            <tx:attributes> 
                <tx:method name="exeCall*" propagation="REQUIRED" /> 
                <tx:method name="search*" propagation="REQUIRED" read-only="true"  /> 
                <!--  只有search方法开启只读事务、exeCall方法时开启读写事务。其他方法如save,update等方法,不开启事务,由内部exeCall方法开启读写事务  --> 
            </tx:attributes> 
        </tx:advice> 
         
        <aop:config> 
            <aop:pointcut id="interceptorPointCuts" 
                expression="execution(* com.manager.BaseManager.*(..))" /><!-- 此处根据baseDao来自行定义 --> 
                <!-- 为interceptorPointCuts切入点应用txAdvice事务切面 --> 
            <aop:advisor advice-ref="txAdvice"  pointcut-ref="interceptorPointCuts" /> 
        </aop:config> 
    baseDao中的写法: 
    ublic Object exeCall(DbCallBackManager dbCallBackManager) throws Exception { 
    return dbCallBackManager.doCallBack(getSession()); 
    } 
    public boolean save(final Object o) { 
    boolean flag = true; 
    try { 
    CtxUtils.getBaseManager().exeCall(new DbCallBackManager() { 
    public Object doCallBack(Session session) { 
    session.save(o); 
    return null; 
    } 
    }); 
    } catch (Exception e) { 
    flag = false; 
    e.printStackTrace(); 
    log.error(e.getMessage(), e); 
    } 
    return flag; 
    } 
    public Object searchObject(Class clazz, long id) { 
    return this.getSession().get(clazz, id); 
    } 
    public SessionFactory getSessionFactory() {
    return sessionFactory;
    }
    
    public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
    } 
    
    public Session getSession() { 
    return this.getSessionFactory().getCurrentSession(); 
    } 
    
    
    定义一个抽象接口类DbCallBackManager:
    
    import org.hibernate.Session; 
    public abstract interface DbCallBackManager { 
    public abstract Object doCallBack(Session session); 
    } 
    HibernateTemplate.execute(new HibernateCallback() {}); 
    2019-07-17 19:03:21
    赞同 展开评论