1

早上好,

昨天我第一次使用MyBatis。作为起点,我使用了Loiane Groner的示例。我试图用内部 hsqldb (v1.8) 替换 mysql db。我改变了一切,但我从来没有让插入单元测试按预期工作。见下文,首先是所有必要的部分。

<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 )。我真的希望,这个测试只会通过一次。如果我第二次调用它,应该有不止一个条目。但这不会发生。为什么,不保持永久联系?(没有清理方法)

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插入方法中的块有关。就个人而言,我认为即使省略 acatch(Exception e){log.error(e)}也是糟糕的政策和伤害。

我不知道hsqldb具体,但是,我已经看到,在某些数据库中,如果在调用“提交”期间发生错误,它将继续显示不应该存在的行。我敢打赌这就是这里发生的事情。

尝试在插入方法中添加catch(Exception e){log.error(e)}之前。finally

于 2011-06-23T08:39:45.797 回答