Spring:没有配置任何事务管理器

时间:2009-04-11 09:22:00

标签: hibernate spring transactions

我一直在努力解决这个问题,并没有看到解决方案。希望有人能帮助我。

我配置了HibernateTransactionManager。但是,我在日志文件中看到以下消息:

DEBUG [http-8080-1] AnnotationTransactionAttributeSource.getTransactionAttribute(107)|使用属性[PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-nl.forestfields.picnic.domain.model.exception.IllegalCostException]添加事务方法[cashIn]

DEBUG [http-8080-1] AnnotationTransactionAspect.createTransactionIfNecessary(267)|跳过事务连接点[nl.forestfields.picnic.view.controller.ShoppingListController.cashIn],因为没有配置事务管理器

此外,如果发生异常,则不会回滚事务。

这是我的配置:

野餐-servlet.xml中:

  <beans>

    <context:component-scan base-package="picnic" />
    <context:annotation-config />

    <tx:annotation-driven />
    .
    .
    .

野餐上下文db.xml:

<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" id="sessionFactory">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
 </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>${hibernate.connection.driver_class}</value>
    </property>
    <property name="url">
        <value>${hibernate.connection.url}</value>
    </property>
    <property name="username">
        <value>${hibernate.connection.username}</value>
    </property>
    <property name="password">
        <value>${hibernate.connection.password}</value>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

应在事务中执行的代码:

@Transactional(rollbackFor=IllegalCostException.class)
public ModelAndView cashIn(@RequestParam final Long id) throws IllegalCostException, llegalOrderStateException, IllegalShoppingListStateException {

  final ShoppingList shoppingList = shoppingListRepository.getById(id);
  shoppingList.cashIn();
  shoppingListRepository.add(shoppingList);

  return new ModelAndView(...);
}

有人能看到问题吗?

干杯, 杰普

5 个答案:

答案 0 :(得分:5)

尝试更改

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

在这里找不到任何其他问题。

答案 1 :(得分:2)

此外,仅对未经检查的例外进行回滚。 如果要回滚Checked Exceptions,则必须在@Transactional注释中声明它:

@Transactional(rollbackFor = { IllegalCostException.class, llegalOrderStateException.class })
public ModelAndView cashIn(@RequestParam final Long id) throws IllegalCostException, llegalOrderStateException, IllegalShoppingListStateException {

  final ShoppingList shoppingList = shoppingListRepository.getById(id);
  shoppingList.cashIn();
  shoppingListRepository.add(shoppingList);

  return new ModelAndView(...);
}

答案 2 :(得分:1)

要解决问题,你必须声明:

<tx:annotation-driven />

进入 picnic-context-db.xml 而不是 picnic-servlet.xml

ltd black

答案 3 :(得分:0)

你说你有两个不同的bean定义文件。这些代表两个不同的应用程序上下文,还是一个导入另一个?

spring文档在这方面并不清楚,但它可能只会自动定位“transactionManager”bean,如果它与它自身在同一个上下文中。如果transactionManager在父上下文中,则可能找不到它。

正如jerrish所说,只需明确指定元素的transaction-manager属性。

答案 4 :(得分:0)

  

尝试更改

     

`&lt; tx:annotation-driven /&gt;

   to 
     

&lt; tx:annotation-driven transaction-manager =“transactionManager”/&gt;

     

在这里找不到任何其他问题。

这不是解决方案,因为春季文件说:

  

您可以省略中的transaction-manager属性    如果bean的名称是标记的   要连接的PlatformTransactionManager具有名称   transactionManager的。   Using @Transactional

其他一些必须改变......