recherche

Maison  >  Questions et réponses  >  le corps du texte

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<code>bean.xml

<bean id="u" class="com.Spring.DAO.UserDAOMySQLimplement">

        <property name="sessionfactor" ref="SessionFactory"/>

    </bean>

     <bean id="LogDAO" class="com.Spring.DAO.LogDAOMySQLimplement">

        <property name="sessionfactor" ref="SessionFactory"/>

    </bean>

    <bean id="Service" class="com.Spring.Service.UserService">

        <property name="dao" ref="u"/>

        <property name="logdao" ref="LogDAO"/>

    </bean>

    <!-- 定义一个数据源 -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

        <property name="url" value="jdbc:mysql://localhost/Spring"/>

        <property name="username" value="root"/>

        <property name="password" value="tiger"/>

    </bean>

    <bean id="SessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

          <property name="dataSource" ref="dataSource"/>

          <property name="annotatedClasses">

            <list>

                <value>com.Spring.Model.User</value>

                <value>com.Spring.Model.Log</value>

            </list>

          </property>

          <property name="hibernateProperties">

             <value>

                hibernate.dialect=org.hibernate.dialect.MySQLDialect

                hibernate.show_sql=true

              </value>

           </property>

    </bean>

    <tx:annotation-driven transaction-manager="txManager"/>       

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

    </bean>

    <tx:annotation-driven transaction-manager="txManager"/>

</code>

Service层

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<code>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;

    }

 

}</code>

UserDAO层

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>   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);       

    }

</code>

LogDAO层

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>      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);   

    }

}  </code>

测试代码

1

2

3

4

5

6

7

8

9

10

<code>   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);

         

    }

</code>

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

ringa_leeringa_lee2899 Il y a quelques jours977

répondre à tous(1)je répondrai

  • 黄舟

    黄舟2017-04-18 10:33:37

    Gestionnaire de transactions

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    <code><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"/></code>

    répondre
    0
  • Annulerrépondre