早上好,
昨天我第一次使用了MyBatis。作为起点,我使用了来自example的Loiane 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? (没有清理方法)
答案 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
。