Почему мой Hibernate DAO ведет себя иначе после обновления до 5? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть старый проект, который работал на 3.6.Я только что обновился до Hibernate 5, и у меня есть пара тестов, которые больше не работают.

Показательный пример:

@Test
public void testConflictingKeyword() {

    Location loc = locationDao.findByKeyword("l1");

    try {
        loc.setKeyword("l2");
        locationDao.update(loc);
        fail("should not be able to update entity, another entity with keyword exists");
    } catch (Exception e) {}
}

Этот тест работает нормально на 3.6.Я вижу, что дао-обновление вызывается, и я получаю исключение constrantviolation.

Однако после обновления до 5 метод обновления больше не вызывается.

Однако, если я добавлю другоеlocationDao.findByKeyword("l1") вызов метода после обновления, затем выполняется обновление sql!

Я подозреваю, что это как-то связано с автокоммитами и сбросом, но я не уверен, где искать и заставить 5 вести себя так же, как в3.6 ...

Если у кого-то есть какие-то подсказки, я был бы благодарен.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Кажется, что они изменили поведение AUTO Flushmode в Hibernate 5.2.Я смог найти только личный блог за короткое время.

Начиная с Hibernate 5.2, если вы загружаете Hibernate с использованием JPA (например, persistence.xml), то даже Hibernate FlushType.AUTO будет вести себя так же, как и его аналог JPA.Только если вы загрузите Hibernate с помощью встроенного механизма, Hibernate Session будет использовать устаревшее поведение FlushType.AUTO.

Cheers, Rainer

0 голосов
/ 07 июня 2018

Еще раз: это проблема с режимом сброса.

По умолчанию hibernate использует режим сброса AUTO, который сообщает, что система может иногда вызывать сброс, чтобы гарантировать, что устаревшие состояния не будут возвращены.

пока вы были на 3.6, ваш сеанс автоматически сбрасывался каждый раз во время обновлений.(зачем хранить неизмененное состояние, если пользователь вызывает обновление: сделайте это и по умолчанию поддерживайте режим AUTO).

Теперь 5 пытается повысить производительность приложений и сократить количество взаимодействий с сервером баз данных.и, следовательно, не сбрасывается при каждом вызове обновления / создания.однако, когда вы пытаетесь выполнить запрос для объектов определенного типа, он проверяет состояние сеанса и видит, что есть изменения в объектах запрашиваемого типа, и, таким образом, выполняет сброс до точного SELECT.

Для преодоления этого: вызовите сбрасывать вручную, когда вы ожидаете этого.Как я могу предположить, вы полагаетесь на уникальную проверку базы данных в упомянутом тесте, и проверка происходит только во время сброса.Это будет самый простой способ модификации.Другой подход заключается в извлечении уникальной проверки чистой базы данных на основе службы ...

Или просто измените конфигурацию спящего режима на использование FlushMode.ALWAYS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...