spring + hibernate:我如何判断spring是否已经获取了所有@transactional注释

时间:2011-11-25 05:39:15

标签: java hibernate spring

我有一个简单的简单java应用程序,它使用spring 2.5.5和hiberate 3.3.1.GA.换句话说,它不是在像tomcat或jboss这样的任何容器中运行。

我想通过使用注释@Tranactional在应用程序中启用事务控制。然而,经过多次试用,申请并没有像我预期的那样开始任何交易。 (在服务器端检查sybase 12.5,使用sp_transactions

我已经阅读了doco几次,希望我没有错过任何内容。

我将<tx:annotation-driven transaction-manager="txManager" />添加到包含需要参与事务的bean的应用程序上下文xml文件中。

任何人都可以建议

1)如何转换spring logging以了解spring框架如何发现和检测@Transactional java类?

2)我使用org.springframework.orm.hibernate3.HibernateTransactionManager作为事务管理器。这是对的吗?

3)我是否需要添加任何jar来启用此支持?

以下是相关applicationContext.xml

的部分列表
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"   
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
    default-lazy-init="false">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName">
            <value>com.sybase.jdbc3.jdbc.SybDriver</value>
        </property>
        <property name="url">
            <value>${jdbc.connection.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.user}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
        <property name="maxWait">
            <value>30000</value>
        </property>
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration
            </value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.SybaseDialect
                </prop>
                <prop key="hibernate.jdbc.batch_size">
                    50
                </prop>
                <prop key="show_sql">true</prop>
                <prop key="hibernate.cache.provider_class">
                    org.hibernate.cache.EhCacheProvider
                </prop>
                <prop key="hibernate.cache.provider_configuration_file_resource_path">
                    ehcache.xml
                </prop>
                <prop key="hibernate.cache.use_query_cache">
                    true
                </prop>
                <prop key="hibernate.cache.use_second_level_cache">
                    true
                </prop>
            </props>
        </property>
    </bean>

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

修改

如果它是相关的(Spring @Transactional concurrency),我自由地使用@Transactional

1 个答案:

答案 0 :(得分:1)

  1. 将org.springframework.transaction的记录器设置为DEBUG
  2. 取决于,如果你在真正的J2EE服务器(WAS,JBoss,...)上运行,那么你应该使用提供的transactionmanager;如果没有(tomcat,jetty)你很好
  3. Javax transaction但是如果你使用maven和hibernate你应该已经拥有它(因为JTA是一个hibernate依赖)。如果在JBoss / WAS / ...上进行部署,请不要部署此jar,这可能与其提供的JTA冲突。