Когда мы используем сброс сессии hibernate против setComplete () - PullRequest
2 голосов
/ 11 октября 2010

Я читал весеннюю документацию, касающуюся метода setComplete () в Hibernate при работе с юнит-тестами.Я запутался между setComplete () и методом flush () сессии.Оба отвечают за сохранение состояния объекта в базе данных путем загрузки из памяти в реальную базу данных.Было бы здорово, если бы кто-нибудь мог помочь мне получить хорошие ресурсы / примеры относительно того же самого.Я буду очень признателен.

Спасибо, Маулик

1 Ответ

4 голосов
/ 12 октября 2010

Насколько мне известно, setComplete() является , а не частью API Hibernate (укажите ссылку, когда вы ссылаетесь на что-то), это часть API AbstractTransactionalSpringContextTests, который является удобным базовым классом для тестов на основе JUnit 3.8, которые должны выполняться в транзакции, но обычно откатывает транзакцию после завершения каждого теста . Метод setComplete() позволяет изменить это поведение транзакции по умолчанию. Из своего Javadoc:

Заставить транзакцию принять этот метод теста , даже если по умолчанию установлен откат.

В следующем разделе документации приведены более конкретные случаи использования:

8.3.6.3. Управление транзакциями

AbstractTransactionalSpringContextTests зависит от PlatformTransactionManager боб определяется в приложении контекст. Имя не имеет значения из-за на использование autowire по типу.

Обычно вы продлеваете подкласс, AbstractTransactionalDataSourceSpringContextTests. Этот класс также требует, чтобы Определение компонента источника данных - снова с любым именем - присутствовать в контекст приложения. Это создает JdbcTemplate переменная экземпляра, полезно для удобного запроса, и предоставляет удобные методы для удаления содержимое выбранных таблиц (помните что транзакция будет отменена по умолчанию, так что это безопасно).

Если вы хотите совершить транзакцию программно - необычно, но иногда полезно, если вы хотите, чтобы определенный тест заполнял База данных - вы можете позвонить setComplete() метод, унаследованный от AbstractTransactionalSpringContextTests. Это приведет к транзакции совершать вместо отката. Как альтернатива, если вы разрабатываете против Java 5 или выше и простирающийся AbstractAnnotationAwareTransactionalTests, Вы можете аннотировать свой метод испытаний с @Rollback(false) чтобы достичь того же эффект через конфигурацию.

Есть также удобная возможность завершить транзакцию перед тестом дело заканчивается, вызывая endTransaction() метод. Это будет откатить транзакцию по умолчанию и передайте это только если setComplete() ранее был вызван. это функциональность полезна, если вы хотите проверить поведение «отключен» объекты данных, такие как отображенные в Hibernate объекты, которые будут использоваться в Интернете или уровень удаленного взаимодействия вне транзакции. Часто ленивые ошибки загрузки обнаружен только через тестирование пользовательского интерфейса; если Вы звоните endTransaction() Вы можете обеспечить правильную работу интерфейса через ваш набор тестов JUnit.

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

...