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 [org.hibernate.impl.SessionImpl@107536b]
[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 [org.springframework.orm.hibernate3.SessionHolder@17b3cdb] for key [org.hibernate.impl.SessionFactoryImpl@14642ac] from thread [main]
[13 Jul 2012 11:29:13,738] DEBUG  TransactionSynchronizationManager | Removed value [org.springframework.jdbc.datasource.ConnectionHolder@129a6a3] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@c506b] from thread [main]
[13 Jul 2012 11:29:13,738] DEBUG  HibernateTransactionManager | Closing Hibernate Session [org.hibernate.impl.SessionImpl@107536b] 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

しかし、データベースから削除すると、変更が永続化され、テーブルから欠落しているオブジェクトがあるため、今後のテストは失敗します。何か不足していますか?どんな方向性でも大歓迎です。前もって感謝します!!

4

2 に答える 2

2

現在のトランザクションに関連付けられているsessionFactory.getCurrentSession()を取得するために使用する必要があります。Session

openSession()新しいセッションを作成し、そのセッションはSpringによって管理されるトランザクションとは何の関係もありません。

于 2012-07-13T18:45:28.490 に答える
0

DriverManagerDataSource を使用したことはありませんが、デフォルトで何らかの「autoCommit」プロパティを true に設定できると思います。c3p0のような実際の接続プールの使用を試みることができます(DriverManagerDataSource クラスは実際の接続プールではないため)。これで、トランザクションに問題はありません。

于 2012-07-13T18:38:27.750 に答える