1

おはようございます、

昨日初めてMyBatisを使いました。出発点として、Loiane Gronerのを使用しました。そして、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("anonym@gmail.com");
    contactDAO.insert( actual );

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

select メソッドを使用して、前に挿入した連絡先を取得するため、このテストはパスします。しかし、hsqldb を開くと、連絡先 ( entry ) がありません。実際には、このテストは 1 回しか合格しないと予想されます。もう一度呼び出すと、複数のエントリが存在するはずです。しかし、これは起こりません。なぜ、連絡先を永久にとどまらないのですか?(クリーンアップ方法はありません)

4

2 に答える 2

2

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

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

別の方法は、テストの最後にデータベースをシャットダウンすることです。接続プロパティを追加してshutdown=true、テストの最後にすべてのデータベース接続を明示的に閉じることができます。

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

于 2011-06-23T09:38:45.793 に答える
1

try...finally問題は挿入メソッドのブロックに関係していると思います。catch(Exception e){log.error(e)}個人的には、a さえも除外するのは悪いポリシーであり、不利益だと思います。

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

insert メソッドの のcatch(Exception e){log.error(e)}前に追加してみてください。finally

于 2011-06-23T08:39:45.797 に答える