2013-03-01 34 views
6

私はH2データベースとの統合テストを書いています。 (この列を持たないテーブルに参加発生したので) マイデータベース(生成)の初期化は、このスクリプトを含める:、H2データベースTIMESTAMP列のデフォルト値

Integration integrationOne = createIntegration(firstId, "FIRST"); 
Integration integrationTwo = createIntegration(secondId, "SECOND"); 
flushAndClear(); 
userService.logRecentIntegration(integrationOne.getId(), user.getId()); 
flushAndClear(); 
userService.logRecentIntegration(integrationTwo.getId(), user.getId()); //1 

メソッドlogRecentIntegrations(..:

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT NOW(); 

これは私がレコードを作成する方法です...)だけでDAOを呼び出し、DAOは、この行います

Query query = entityManager.createNativeQuery(
    "INSERT INTO INT_USR (USR_ID, INT_ID) VALUES (?, ?)"); 
query.setParameter(1, userId) 
    .setParameter(2, integrationId); 
query.executeUpdate(); 

その後、私のテストで:

Query query = entityManager.createNativeQuery(
    "SELECT * FROM INT_USR ORDER BY IU_INSDTTM"); 
List resultList = query.getResultList(); 

resultListでこのテストをデバッグすると、2つのレコード(正しい)がありますが、タイムスタンプは同じです。 // 1とマークされた行にブレークポイントを挿入してしばらく待っていたとしても、挿入間の時間差は重要です。 (のThread.sleep - 同じ結果)

私は

ALTER TABLE INT_USR ADD IU_INSDTTM TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 

しかし、同じ結果にSQLスクリプトを変更してみました。両方の結果が同じタイムスタンプを持つ理由

答えて

6

文書のとおり、the function CURRENT_TIMESTAMPはトランザクション内で常に同じ値を返します。この動作は、PostgreSQLなどの他のデータベースと一致します。

+0

'@Service @Transactional パブリッククラスUserServiceImplがUserServiceの{ ... 公共ボイドlogRecentIntegration(ロングintegrationId、ロングUSERID){} ' を実装しますので、メソッドを呼び出すたびに異なるトランザクション内にある、ではありませんそれ? – DominikM

+0

これは私にはわかりませんが、私はJPAにあまり精通していません。しかし私はH2に精通しています:-) –

+1

@DominikMいいえ、そうではありません。デフォルトの伝播レベル '@Transactional'はREQUIREDです。つまり、トランザクションがない場合は、新しいトランザクションが開始されます。存在する場合は、それを使用します。私は知っている、あなたはテストからそれを呼び出した、それは単一のトランザクションです。 – banterCZ

0

テストに次の注釈を追加して、トランザクションを無効にすることができます。

@Transaction(propagation = Propagation.NEVER)

注:それ注釈は春から来て、あなたが以内に実行している環境のために何か他のものがあるかもしれません。

関連する問題