2012-07-13 62 views
1

PersistenceHelper-context.xml的回滚交易似乎被回滚,但他们没有在数据库

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!----> 
     <property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver"/> 
     <property name="url" value="jdbc:hsqldb:mem:mydb"/> 
     <property name="username" value="sa"/> 
     <property name="password" value=""/> 
    </bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" 
      depends-on="dataSource" name="_sessFac" > 
     <property name="dataSource" ref="dataSource"/> 
     <property name="configLocation" value="hibernate.cfg.xml.incDTD"/> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.connection.shutdown">true</prop> 
      </props> 
     </property> 
    </bean> 

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

类的头

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:PersistenceHelper-context.xml"}) 
@TransactionConfiguration(defaultRollback = true, transactionManager = "transactionManager") 
@Transactional 
public class BaseClass extends BaseTestClass{//.....} 

然后我所有的班,我想利用交易都来自BaseClass的派生,即 public class FooTest extends BaseClass

此外,当我跑我的代码,我看到以下内容:

HibernateTransactionManager | Initiating transaction rollback 
[13 Jul 2012 11:29:13,738] DEBUG HibernateTransactionManager | Rolling back Hibernate transaction on Session [[email protected]] 
[13 Jul 2012 11:29:13,738] DEBUG HibernateTransactionManager | Triggering afterCompletion synchronization 
[13 Jul 2012 11:29:13,738] DEBUG TransactionSynchronizationManager | Clearing transaction synchronization 
[13 Jul 2012 11:29:13,738] DEBUG TransactionSynchronizationManager | Removed value [[email protected]] for key [[email protected]] from thread [main] 
[13 Jul 2012 11:29:13,738] DEBUG TransactionSynchronizationManager | Removed value [[email protected]] for key [[email protected]b] from thread [main] 
[13 Jul 2012 11:29:13,738] DEBUG HibernateTransactionManager | Closing Hibernate Session [[email protected]] after transaction 
[13 Jul 2012 11:29:13,738] DEBUG SessionFactoryUtils  | Closing Hibernate Session 
[13 Jul 2012 11:29:13,738] INFO TransactionalTestExecutionListener | Rolled back transaction after test execution for test context 

然而,当我从我的数据库中删除,更改是持久的,我未来的测试失败,因为表中缺少一个对象。我错过了什么吗?任何方向将不胜感激。提前致谢!!

+0

你如何获得Hibernate会话?您确定您使用的会话是事务回滚的会话吗? – axtavt 2012-07-13 18:00:32

+0

'Session session = _sessFac.openSession();'然而,我为每个@Test获取一个新会话。虽然我认为这是合法的,因为类顶部的@Transactional注释包含事务中的每个方法。 – nook 2012-07-13 18:09:14

+0

你确定hsqldb支持事务吗?并非每个数据库都支持它们例如,在使用MyISAM存储引擎表时,MySQL不支持事务,只有InnoDB和BDB。检查这个hsql文档。 – Matt 2012-07-13 18:00:55

回答

2

您应该使用sessionFactory.getCurrentSession()获得与当前交易相关联的Session

openSession()创建一个新的会话,并且该会话与Spring管理的事务无关。

+0

这可能已经做到了。还有一些东西要弄清楚,如果是这样,我会接受。 – nook 2012-07-13 19:21:22

0

我从来没有使用DriverManagerDataSource,但我认为它可以有某种默认设置为true的“autoCommit”属性。您可以尝试使用真实连接池,如c3p0(因为DriverManagerDataSource类不是实际的连接池)。有了它,我没有任何交易问题。