Quarkus Panache Hibernate: Как очистить кэш, чтобы мир сущностей соответствовал состоянию базы данных? - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в Quarkus и, похоже, у меня проблема с кэшированием hibernate в модульном тесте. В тест вводится «UserTransaction». Тест должен проверить задачу очистки базы данных.

Вот что мне нужно сделать:

  1. создать объект
  2. начать транзакцию
  3. сохранить объект с шаблоном «Активная запись» с 'persistAndFlu sh'
  4. зафиксировать транзакцию
  5. попытаться получить объект из базы данных через 'find (id)', чтобы убедиться, что он был сохранен
  6. run задача очистки (сущность удаляется из БД)
  7. попытаться снова извлечь сущность из базы данных через 'find (id)', чтобы убедиться, что она была удалена
    Document doc;
    UUID uuid;
    doc = new Document();
    uuid = UUID.randomUUID();
    doc.uuid = uuid;
    doc.doc = new byte[0];
    doc.createdAt = Instant.now();
    transaction.begin();
    doc.persistAndFlush();
    transaction.commit();
    doc = Document.findById(uuid);
    Assertions.assertNotNull(doc);
    TimeUnit.SECONDS.sleep(Long.parseLong(maxAge)+1);
    scheduler.cleanUp();
    doc = Document.findById(uuid);
    Assertions.assertNull(doc);

Шаг 7 завершается неудачно, потому что 'find (id)' возвращает сущность, хотя ее больше нет в БД.

ЭТОГО НЕ произойдет, если я пропущу шаг 5! Так что, похоже, это проблема с кешированием.

Я пытался внедрить 'Session', 'SessionFactory' и 'EntitiyManager', чтобы получить доступ к текущему Hibernate Session, но ни одного, если это удалось.

Может быть, во всем подходе не хватает того, чего я не получил? Как сделать так, чтобы мир сущностей соответствовал базе данных в настройке, подобной моей?

Любые советы и идеи приветствуются.

TIA

1 Ответ

0 голосов
/ 02 апреля 2020

Задача имеет простое решение, добавьте транзакцию к последней операции поиска:

transaction.begin();
doc = Document.findById(uuid);
transaction.commit();
...