私は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スクリプトを変更してみました。両方の結果が同じタイムスタンプを持つ理由
'@Service @Transactional パブリッククラスUserServiceImplがUserServiceの{ ... 公共ボイドlogRecentIntegration(ロングintegrationId、ロングUSERID){} ' を実装しますので、メソッドを呼び出すたびに異なるトランザクション内にある、ではありませんそれ? – DominikM
これは私にはわかりませんが、私はJPAにあまり精通していません。しかし私はH2に精通しています:-) –
@DominikMいいえ、そうではありません。デフォルトの伝播レベル '@Transactional'はREQUIREDです。つまり、トランザクションがない場合は、新しいトランザクションが開始されます。存在する場合は、それを使用します。私は知っている、あなたはテストからそれを呼び出した、それは単一のトランザクションです。 – banterCZ