【问题标题】:Inserted entries aren't remaining permanent in the db插入的条目不会在数据库中永久保留
【发布时间】:2011-06-23 08:29:23
【问题描述】:

早上好,

昨天我第一次使用MyBatis。作为起点,我使用了来自Loiane Gronerexample。我试图用内部 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 )。 我真的希望,这个测试只会通过一次。如果我第二次调用它,应该有不止一个条目。但这不会发生。为什么,不保持永久联系? (没有清理方法)

【问题讨论】:

    标签: java insert hsqldb mybatis


    【解决方案1】:

    这是因为您对 HSQLDB 的设置是默认设置。

    使用默认设置,数据库有一个写入延迟。这通常适用于应用程序嵌入式数据库,但如果您希望更改立即持久化,则需要关闭 WRITE DELAY 进行测试。使用hsqldb.write_delay=false 作为连接属性。

    另一种方法是在测试结束时关闭数据库。您可以添加连接属性shutdown=true 并在测试结束时显式关闭所有数据库连接。

    这些属性在 HSQLDB 1.8 和 2.x 中是相同的,并在此处记录: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

    【讨论】:

    • 是的,这有效,但仅与 UNPOOLED 作为数据源类型结合使用。与池它没有工作。谢谢你。真诚的
    【解决方案2】:

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

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

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

    【讨论】:

    • 不会抛出异常。感谢您的提示,我没有看到丢失的捕获部分:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多