Вставленные записи не остаются постоянными в БД - PullRequest
1 голос
/ 23 июня 2011

Доброе утро,

вчера я впервые использовал MyBatis.В качестве отправной точки я использовал пример из Loiane Groner .И я попытался заменить базу данных mysql внутренним 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, в нем нет контакта (входа). Я бы точно ожидал, что этот тест пройдет только один раз.И если я позвоню во второй раз, должно быть более одной записи.Но этого не происходит.Почему не остается контактным лицом?(Нет метода очистки)

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Это потому, что ваши настройки для HSQLDB являются настройками по умолчанию.

При настройках по умолчанию база данных имеет ЗАДЕРЖКУ ЗАПИСИ. Это нормально для встроенных баз данных приложения, но вам нужно отключить WRITE DELAY для тестирования, если вы ожидаете, что изменения будут сохранены немедленно. Используйте hsqldb.write_delay=false в качестве свойства соединения.

Альтернативой является отключение базы данных в конце теста. Вы можете добавить свойство соединения shutdown=true и явно закрыть все соединения с базой данных в конце теста.

Эти свойства одинаковы в HSQLDB 1.8 и 2.x и описаны здесь: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

1 голос
/ 23 июня 2011

Я предполагаю, что проблема связана с блоком try...finally в методе вставки.Лично я считаю, что пропуск даже catch(Exception e){log.error(e)} - это плохая политика и плохая услуга.

Я не знаю конкретно о hsqldb, но, как я видел, в некоторых БД возникает ошибкаво время вызова «commit» он продолжит показывать строки, которых не должно быть.Держу пари, вот что здесь происходит.

Попробуйте добавить catch(Exception e){log.error(e)} перед finally в методе вставки.

...