2016-08-17 8 views
1

私は春を使用してMVCプロジェクトに取り組んでいるジュニアCSの主要な学生です。メモリデータベースのH2を使用したSpringテストはすべてのテーブルを切り捨てます

メモリデータベースにH2を設定し、2つのSQLスクリプトを書きました。 1つはデータベースを作成し、もう1つはデータベースを空にします。

私が知る限り、truncate table <table name>delete from <table name>の実用的な違いは、truncate tableがddlであることです。そのため、自動インクリメントの列もリセットされます。問題は、H2の切り捨てテーブルが自動インクリメントされたカラムをリセットしないことです。私がうんざりしているところを指摘できますか?

私は、春のSqlGroup注釈を使用してスクリプトを実行しています。

@SqlGroup({ 
    @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = 
               "classpath:populate.sql"), 
    @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = 
                "classpath:cleanup.sql") 
}) 

ここで、すべてのテーブルを切り捨てるはずのcleanup.sqlがあります。

SET FOREIGN_KEY_CHECKS=0; 

TRUNCATE TABLE `criteria`; 
TRUNCATE TABLE `job_title`; 
TRUNCATE TABLE `organization`; 
TRUNCATE TABLE `organization_teams`; 
TRUNCATE TABLE `organization_users`; 
TRUNCATE TABLE `organization_job_titles`; 
TRUNCATE TABLE `review`; 
TRUNCATE TABLE `review_evaluation`; 
TRUNCATE TABLE `team`; 
TRUNCATE TABLE `team_members`; 
TRUNCATE TABLE `user`; 
TRUNCATE TABLE `user_criteria_list`; 

SET FOREIGN_KEY_CHECKS=1; 

populate.sqlは、整合性制約に違反することなく、これらのテーブルに一連の行を挿入するだけです。

私はテストクラスを実行するので、最初のメソッドだけが渡されます。残りのために私はこのようなものを得る:

参照整合性制約違反を: "FK3MAB5XYC980PSHDJ3JJ6XNMMT:PUBLIC.ORGANIZATION_JOB_TITLES FOREIGN KEY(JOB_TITLES_ID)がPUBLIC.JOB_TITLE(ID)を参照(1)"; SQL文:organization_job_titles(ORGANIZATION_ID、job_titles_id)INTO INSERT VALUES(1、1)

私はこの問題は、リセットされていない自動インクリメント列から生じたと思いました。だから私は、別のテストクラスを書い:

monAutoIncTest.java

@Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = 
    "classpath:truncateTable.sql") 
    public class monAutoIncTest { 
     @Autowired 
     OrganizationService organizationService; 

     @Test 
      public void h2truncate_pls() throws BaseException { 
      organizationService.add(new Organization("Doogle")); 
      Organization fetched = organizationService.getByName("Doogle"); 
      Assert.assertEquals(1, fetched.getId()); 
     } 

     @Test 
     public void h2truncate_plz() throws BaseException { 
      organizationService.add(new Organization("Zoogle")); 
      Organization fetched = organizationService.getByName("Zoogle"); 
      Assert.assertEquals(1, fetched.getId()); 
     } 
    } 

最初のパスを実行し、他方が与えているtruncateTable.sql

SET FOREIGN_KEY_CHECKS=0; 

TRUNCATE TABLE `organization`; 

SET FOREIGN_KEY_CHECKS=1; 

テストが実行されると、どちらの方法で私はこれ。

にjava.lang.AssertionError: 予想:1 実際:2

答えて

1

今H2がその機能をサポートしていませんが、我々はtheir roadmap

TRUNCATE should reset the identity columns as in MySQL and MS SQL Server (and possibly other databases).

で、そのような計画はこれを使用してみてください見ることができますについて文中の文は、TRUNCATE

ALTER TABLE [table] ALTER COLUMN [column] RESTART WITH [initial value] 
+0

です。これは驚異的でした。 – Felicyta

関連する問題