hibernate - 用Spring的声明式事务,得到异常no transaction is in progressjava

 wangtao 发布于 2022-10-26 03:53

在进行Spring和hibernate的整合时,利用Spring的声明式事务管理,得到一个异常:no transaction is in progress
在网上查阅相关资料,发现有的需要加注解@Transactional,有的是因为加了两个实体管理类,但是都无法解决我的问题。
以下是相关代码:

bean.xml

        
    
     
        
    
    
        
        
    
    
    
        
        
        
        
    
    
          
          
            
                com.Spring.Model.User
                com.Spring.Model.Log
            
          
          
             
                hibernate.dialect=org.hibernate.dialect.MySQLDialect
                hibernate.show_sql=true
              
           
    
            
    
        
    
    

Service层

public class UserService {
    private UserDAO dao=null;
    private LogDAO logdao;
    public LogDAO getLogdao() {
        return logdao;
    }
    public void setLogdao(LogDAO logdao) {
        this.logdao = logdao;
    }
    @Transactional("txManager")
    public void add(User u){
        dao.add(u);
        Log log=new Log();
        log.setMsg("日志:成功存入用户");
        logdao.add(log);
    }
    public UserDAO getDao() {
        return dao;
    }
    public void setDao(UserDAO dao) {
        this.dao = dao;
    }

}

UserDAO层

   public class UserDAOMySQLimplement implements UserDAO {
    SessionFactory sessionfactor;            //定义一个sessionfactor,使用自动注入来初始化。
    public SessionFactory getSessionfactor() {
        return sessionfactor;
    }
    public void setSessionfactor(SessionFactory sessionfactor) {
        this.sessionfactor = sessionfactor;
    }
    //往数据库保存一条记录
    public void add(User u) {
        Session session=sessionfactor.getCurrentSession();
        session.save(u);        
    }

LogDAO层

      public class LogDAOMySQLimplement implements LogDAO {
    SessionFactory sessionfactor;            //定义一个sessionfactor,使用自动注入来初始化。
    public SessionFactory getSessionfactor() {
        return sessionfactor;
    }
    public void setSessionfactor(SessionFactory sessionfactor) {
        this.sessionfactor = sessionfactor;
    }
    //往数据库保存一条记录
    @Override
    public void add(Log log) {
        Session session=sessionfactor.getCurrentSession();
        session.save(log);    
    }
}  

测试代码

   public void Test_add(){
        ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
        User u=new User();
        u.setName("小明"); 
        UserService us=(UserService) context.getBean("Service");
        System.out.println(us.getClass());
        us.add(u);
        
    }

所用版本Spring4.3.4,hibernate5.2.5
想要完成的业务逻辑是往数据库插入一条User记录,并且往日志表插入一条日志。

1 个回答
  • Transaction Manager

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=${hibernate.dialect}
            </value>
        </property>
    </bean>
    
    <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
    <tx:annotation-driven transaction-manager="txManager"/>
    2022-11-12 01:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有