插入的条目不会在db中保持永久性

时间:2011-06-23 08:29:24

标签: java insert hsqldb mybatis

早上好,

昨天我第一次使用了MyBatis。作为起点,我使用了来自exampleLoiane Groner。我试图用内部hsqldb(v1.8)替换mysql数据库。我改变了一切,但我从未让插入单元测试按预期工作。请参阅下文,首先是所有必要的部分。

<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,则没有联系人(条目)。 我真的希望,这个测试只能通过一次。如果我第二次打电话,应该有一个以上的条目。但这不会发生。为什么,不保持联系permant? (没有清理方法)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我猜这个问题与insert方法中的try...finally块有关。就个人而言,我认为即使是catch(Exception e){log.error(e)},也要忽略不好的政策和伤害。

我并不特别了解hsqldb,但是,我已经看到,在某些DB中,如果在调用“commit”期间发生错误,它将继续显示不应存在的行。我敢打赌这就是这里发生的事情。

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