@ Генерируется в HSQL DB - PullRequest
       37

@ Генерируется в HSQL DB

0 голосов
/ 08 сентября 2011

Предположим, что в таблице базы данных есть неключевой столбец с именем RECORD_ID, который автоматически генерируется / упорядочивается в базе данных.

Теперь в моей сущности для таблицы выше, чуть выше поля для RECORD_ID, я использую аннотацию hibernate @Generated, чтобы указать hibernate, что DB будет нести ответственность за вставку значения в это конкретное поле. Это выглядит следующим образом:

@Column(name = "RECORD_ID", unique = true, nullable = true, insertable = false, updatable =  false)
    @Generated(GenerationTime.INSERT)
    private Long recordId;

Я запускаю свой код, и он работает нормально. DB вставляет значение, как и ожидалось.

Теперь я пишу пример модульного теста с HSQL, чтобы убедиться, что моя логика не повреждена. Логика имеет запрос, который выбирает запись на основе RECORD_ID.

Теперь, когда я создаю прибор и вызываю свой тест, HSQL не будет генерировать значение для RECORD_ID записи при сохранении моего прибора. Это оставляет это как ноль. Но логика, которую я собираюсь проверить, основана на получении RECORD_ID, что здесь невозможно.

В HSQL DB он остается нулевым. И поэтому я не могу завершить модульное тестирование!

Просьба пролить свет на решение этой проблемы или обходного пути.

Пожалуйста, найдите код модульного теста ниже

@Test
public void testProductCancelDAL() {
    savePrerequisites();
    Logic myLogic = new Logic();
    /* Logic fetches the reservation record based on RECORD_ID */
    assertNotNull(myLogic.invoke());

}
public void savePrerequisites() {
    //Stroing product type
    Product product = ProductFixture.createProduct();
    sessionFactory.getCurrentSession().save(product);

    //Storing Itinerary
    Itinerary itn = ItnFixture.create();
    sessionFactory.getCurrentSession().save(itn);

    Reservation res = ReservationFixture.create();
    sessionFactory.getCurrentSession().save(res);
    sessionFactory.getCurrentSession().flush();
}

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Судя по тому, что вы сказали в комментариях, кажется, что вы тестируете некоторый код, который зависит от триггера в базе данных, генерирующего RECORD_ID, но вы тестируете его в базе данных в памяти, где этот триггер несуществовать.Это, очевидно, не сработает.Вам нужно создать тот же триггер, что и в вашей производственной базе данных.См. http://hsqldb.org/doc/2.0/guide/triggers-chapt.html, чтобы создать триггеры в базе данных HSQLDB.

1 голос
/ 08 сентября 2011

В вашем случае, RECORD_ID не является первичным ключом?

В этом случае вам следует использовать @GeneratedValue с аннотацией @Id.

Проблема сгенерированными в базе данных значениями заключается в том, что запись должна быть перечитана после вставки (это не относится к столбцам AUTOINCREMENT, где последний сгенерированный идентификатор может быть прочитан с помощью специальной инструкции).

...