2017-04-15 3 views
0

なぜSpring @TransactionalのテストメソッドがHibernateによって@Beforeで行われた変更をロールバックしないのか理解できませんか? 1つのトランザクション内で@Before@Testが呼び出されるinformationがあります。すべてのコンテキストが構成されているとみなされる可能性があります。必要に応じて@Before内のすべての変更がロールバックされ`.createSQLQuery`で切り捨てた後、スプリング/ハイバネートはトランザクションをロールバックしません

@Test 
@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional(defaultRollback = true, transactionManager = "transactionManager") 
public class TestClass { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Autowired 
    private EntityDao entityDao; 

    @Before 
    public void before() { 
     // create arbitrary entity 
     Entity one = Utils.createEntity(); 
     // save with HibernateDao to table_1 
     entityDao.save(one); 
    } 

    @Test 
    public void test() { 
     sessionFactory.getCurrentSession().createSQLQuery("TRUNCATE table_2").executeUpdate(); 
    } 
} 

createSQLQuery().executeUpdateなければ

+0

?それらのすべてがトランザクションのTRUNCATEをサポートするわけではありません。 –

+0

私はmysqlを使用していますが、[操作を切り捨てると暗黙のコミットが発生するため、ロールバックできません。](https://dev.mysql.com/doc/refman/ 5.7/ja/truncate-table.html)。ジェスチャーを使用して、一部のdbmsがトランザクション・トランケートをサポートしていないという問題がある理由を説明できますか?私はこの場合どのように起こるか知りたいです。 –

答えて

0

クエリは暗黙的にトランザクションをコミットします(DDLクエリと見なされるため、テーブルを削除して再作成します)。 DDL問合せは一般的にコミットを引き起こします。

トランザクションが正常に動作するようにするには、DELETE FROM <table-name>を使用できます。

更新

詳細情報:あなたが使用しているDBMS Do DDL statements always give you an implicit commit, or can you get an implicit rollback?

関連する問題