使用HibernateCallback进行春季测试不起作用 - java

我尝试测试WriteTxnFinishProcessorTest,并且它运行无任何异常。
休眠日志显示它可以正确回滚,但是db字段“ LastUpdateTime”仍会更新新值。
为什么?
HibernateCallback不在休眠事务下吗?

日志显示如下:

[main         ] 20120104 15:44:54.284 INFO  HibernateTransactionManager - Using DataSource [com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 5000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 2sa1nt8k1aivnzwna070g|1a7b0bf, debugUnreturnedConnectionStackTraces -> true, description -> null, driverClass -> com.sybase.jdbc3.jdbc.SybDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 2sa1nt8k1aivnzwna070g|1a7b0bf, idleConnectionTestPeriod -> 120, initialPoolSize -> 2, jdbcUrl -> jdbc:sybase:Tds:10.10.10.203:6332/NIAIMM, lastAcquisitionFailureDefaultUser -> null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 180, maxIdleTimeExcessConnections -> 120, maxPoolSize -> 50, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 2, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 60, usesTraditionalReflectiveProxies -> false ]] of Hibernate SessionFactory for HibernateTransactionManager
[main         ] 20120104 15:44:54.557 DEBUG AbstractPlatformTransactionManager - Creating new transaction with name [testProcessIn]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
[main         ] 20120104 15:44:54.614 DEBUG HibernateTransactionManager - Opened new Session [org.hibernate.impl.SessionImpl@6af2fb] for Hibernate transaction
[main         ] 20120104 15:44:54.619 DEBUG HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@6af2fb]
[main         ] 20120104 15:44:54.652 DEBUG HibernateTransactionManager - Exposing Hibernate transaction as JDBC transaction [com.mchange.v2.c3p0.impl.NewProxyConnection@11f5ff9]
[main         ] 20120104 15:44:54.668 DEBUG LoggingAspect        - DAO:GenericDAOImpl.executeHQLUpdate
[main         ] 20120104 15:44:54.680 DEBUG LoggingAspect        - args:[update DailyImmigrationsTemp set ImmigRcode='0000', LastUpdateTime=?, TxnMark=0 where EdCardNo=? and Port=? and ImmigrateDate=? and ImmigrateSeq=?, [Ljava.lang.Object;@1267610]
[main         ] 20120104 15:44:55.372 DEBUG SQLStatementLogger   - update DailyImmigrationsTemp set ImmigRcode='0000', LastUpdateTime=?, TxnMark=0 where EdCardNo=? and Port=? and ImmigrateDate=? and ImmigrateSeq=?
[main         ] 20120104 15:44:55.421 WARN  LoggingAspect        - execution  time:740 ms, return:1
[main         ] 20120104 15:44:55.422 DEBUG AbstractPlatformTransactionManager - Initiating transaction rollback
[main         ] 20120104 15:44:55.422 DEBUG HibernateTransactionManager - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@6af2fb]
[main         ] 20120104 15:44:55.455 DEBUG HibernateTransactionManager - Closing Hibernate Session [org.hibernate.impl.SessionImpl@6af2fb] after transaction

=== WriteTxnFinishProcessorTest.java ===

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContextTest.xml")
@TransactionConfiguration(transactionManager="txManager",defaultRollback=true)
@Transactional
public class WriteTxnFinishProcessorTest {
    @Autowired 
    private GenericDAO dailyImmigrationsTempDAO;

    @Test
    public void testProcessIn() {
        String  hql="update DailyImmigrationsTemp set LastUpdateTime=? where EdCardNo=? and Port=? and ImmigrateDate=? and ImmigrateSeq=?";
        Object[] params=new Object[]{new Date(),"5550137001",12,"20111214",1};
        int cnt = dailyImmigrationsTempDAO.executeHQLUpdate(hql, params);
        System.out.println("cnt:"+cnt);
    }
}

=== DailyImmigrationsTempDAO.java ===

   :
   :
public int executeHQLUpdate(final String hql, final Object[] params ){
    int ret = (Integer)getHibernateTemplate().execute(new HibernateCallback<Object>() {
        public Object doInHibernate(Session sess) throws HibernateException {
            Query query = sess.createQuery(hql);
            for (int i=0;i<params.length;i++){
              query.setParameter(i, params[i]);  
            }
            return query.executeUpdate();
        }
    });
    return ret;
}

=== applicationContextTest.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        :
        : 
    </bean>
    <bean id="abstractDAO" abstract="true">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" destroy-method="destroy">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
        <property name="packagesToScan">
            <list>
                <value>com.pojo</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.SybaseDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <bean id="dailyImmigrationsTempDAO" class="com.dao.GenericDAOImpl" parent="abstractDAO">
        <constructor-arg value="com.pojo.DailyImmigrationsTemp" />
    </bean>
</beans>

参考方案

您似乎没有更改Spring事务测试的默认值,因此@TransactionConfiguration(transactionManager =“ txManager”,defaultRollback = true)行似乎没有任何作用。但是,您引用的是一个名为txManager的bean,该bean未在您的bean配置文件中声明。从docs:

@TransactionConfiguration

定义用于配置事务测试的类级元数据。
具体来说,PlatformTransactionManager的bean名称是
如果要
所需的PlatformTransactionManager的bean名称不是
“ transactionManager”。另外,您可以更改defaultRollback
标记为false。通常,@ TransactionConfiguration用于
与@ContextConfiguration结合使用。

春季测试赛跑者可能对您的交易经理感到困惑;由所示配置创建的隐式名为“ transactionManager”。尝试完全删除该行。尝试尝试的另一件事是使用@Transactional显式注释您的executeHQLUpdate()方法。

页面加载而不是提交时发生struts验证 - java

请原谅我;我对Struts有点陌生。我遇到一个问题,即页面加载而不是我实际提交表单时发生了验证。我整天都在论坛上搜寻和搜寻,没有任何运气。我显然做错了一些事情,应该很容易确定,但是我还没有发现问题所在。这是我的struts.xml的片段:<action name="*Test" method="{1}" clas…

DataSourceTransactionManager和JndiObjectFactoryBean和JdbcTemplate的用途是什么? - java

以下的用途是什么:org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTransactionManager org.springframework.jndi.JndiObjectFactoryBean <tx:annotatio…

在特定的Swing组件上设置自定义外观 - java

是否可以在Swing GUI上仅针对特定组件或组件集设置用于Synth外观的文件,而无需为其他任何组件进行更改? java参考方案 是的,有可能。将类型指定为“区域”,将其更改为“名称”,将值更改为由setName(“ componentName”)给定的特定名称;应用程序中的方法。添加这个<style id="titleBarButtons…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…

展平地图中的列表列表 - java

我有订单流(来源是订单列表)。每个订单都有一个客户和一个OrderLine列表。我要实现的目标是在一张简单的列表中以客户为关键的地图,并将属于该客户的所有订单行作为值。现在,通过执行以下操作,我现在管理的内容返回了Map<Customer>, List<Set<OrderLine>>>:orders .collect…