9

次のテストがあります。

public class Book
{
     public boolean postLoadInvoked;
     @PostLoad
     private void onPostLoad()
     {
         postLoadInvoked = true;
     }
}

public class MyIntegrationTest extends AbstractIntegrationTest
{
     @Autowired
     private BookDAO bookDAO;

     @Test
     public void loadBooks()
     {
          Book book = bookDAO.findOne(...);
          assertTrue(book.postLoadInvoked);
     }  
}

@Transactionalこのテストはそのまま合格しますが、注釈をテスト クラスに追加すると失敗します。

@Transactional
@TransactionConfiguration(defaultRollback=true)
public class MyIntegrationTest extends AbstractIntegrationTest

@Transactionalを使用してテストを構成すると、JPA コールバック メソッドに影響するのはなぜですか?

編集

DAO は単なる Spring Data リポジトリであるため、ロジックはありません。

public interface BookDAO extends
   JpaRepository<Book, Long>, 
   QueryDslPredicateExecutor<Book> {}

トランザクション マネージャーには、次の標準構成もあります。

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>com.mangofactory.example</value>
        </list>
    </property>
    <property name="persistenceUnitName" value="spring-test" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
            <property name="generateDdl" value="true" />
            <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" />
        </bean>
    </property>
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" />
</bean>
4

2 に答える 2

1

あなたが使用している春のバージョンが何であるか、または AbstractIntegrationTest が何かを拡張しているかどうかはわかりませんが、確認すべきことの 1 つは、階層内で、テストが抽象的なトランザクション コンテキストを意識した春のテスト クラスを拡張する必要があることです。

私が考えているクラス:

org.springframework.test.AbstractTransactionalSpringContextTests
org.springframework.test.AbstractTransactionalDataSourceSpringContextTests

またはいくつかの jUnit フレーバー (使用しているバージョンによって異なります):

org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
org.springframework.test.context.junit38.AbstractTransactionalJUnit38SpringContextTests
于 2012-09-07T06:15:33.220 に答える
0

次の 2 つの理由が考えられます。

  1. @PostLoadトランザクションがコミットされた後にのみ実行されます。ありそうもない。

  2. どのようにしてトランザクションを有効にしましたか? 指定しましたproxyTargetClass = trueか?そうしないと、奇妙な動作が発生する可能性があります。

于 2012-09-07T10:22:28.137 に答える