2011-06-23 8 views
1

おはよう、挿入されたエントリがデータベースに永久的に残らない

昨日私は初めてMyBatisを使用しました。出発点として、のexampleを使用しました。そして、私はmysql dbを内部hsqldb(v1.8)に置き換えようとしました。私はすべてを変えましたが、挿入ユニットテストが期待どおりに動作することはありませんでした。以下、最初に必要なすべての部分を参照してください。

<insert id="insert" parameterType="Contact"> 
    INSERT INTO CONTACT (CONTACT_EMAIL, CONTACT_NAME, CONTACT_PHONE) 
     VALUES (#{email}, #{name}, #{phone}); 
</insert> 
public void insert(Contact contact){ 

    SqlSession session = sqlSessionFactory.openSession(); 

    try { 
     session.insert("Contact.insert", contact); 
     session.commit(); 
    } finally { 
     session.close(); 
    } 
} 
@Test 
public void testInsert() { 

    Contact actual = new Contact(); 
    actual.setName("Adam"); 
    actual.setPhone("+001 811 23456"); 
    actual.setEmail("[email protected]"); 
    contactDAO.insert(actual); 

    assertEquals(1, contactDAO.selectAll().size()); 
} 

selectメソッドで、私は私の前に挿入された連絡先を取得しますので、このテストは、合格します。しかし、私がhsqldbを開いた場合、連絡先(エントリ)はありません。 私は、このテストは一度だけ通過すると予想していました。私はそれを2回目と呼びますが、複数のエントリーがあるはずです。しかし、これは起こらない。なぜ、連絡先のパーマネントを残していないのですか? (クリーンアップメソッドはありません)

答えて

2

これは、HSQLDBの設定がデフォルト設定であるためです。

デフォルト設定では、データベースには書き込み遅延があります。これは、通常はアプリケーション組み込みデータベースにとっては問題ありませんが、変更を直ちに持続することが期待される場合は、テストのためにWRITE DELAYをオフにする必要があります。接続プロパティとしてhsqldb.write_delay=falseを使用します。

代わりに、テストの最後にデータベースをシャットダウンすることもできます。接続プロパティーshutdown=trueを追加して、テストの最後にすべてのデータベース接続を明示的にクローズすることができます。

これらのプロパティは、HSQLDB 1.8と2.xで同じであり、ここで文書化: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

+0

はいこれはデータソースの種類としてUNPOOLEDとの組み合わせでのみ機能します。プールされていると動作しませんでした。ありがとうございました。敬具 –

1

この問題は、挿入方法のtry...finallyブロックと関係があると思います。個人的には、catch(Exception e){log.error(e)}でも除外することは、悪い方針であり、不利益であると思います。

具体的にはわかりませんが、特定のDBでは、「コミット」の呼び出し中にエラーが発生した場合、存在してはいけない行が表示され続けます。私はそれがここで起こっていることを賭けるでしょう。

finallyの挿入方法の前にcatch(Exception e){log.error(e)}を追加してみてください。

+0

スローされる例外はありません。そして、おかげで、私は欠けているキャッチ部分を見ていない:) –

関連する問題