Установить режим сброса Hibernate сессии в Spring - PullRequest
6 голосов
/ 28 октября 2010

Я пишу интеграционные тесты, и в одном методе тестирования я хотел бы записать некоторые данные в БД и затем прочитать их.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
@TransactionConfiguration()
@Transactional
public class SimpleIntegrationTest {

    @Resource
    private DummyDAO dummyDAO;

    /**
     * Tries to store {@link com.example.server.entity.DummyEntity}.
     */
    @Test
    public void testPersistTestEntity() {
        int countBefore = dummyDAO.findAll().size();
        DummyEntity dummyEntity = new DummyEntity();
        dummyDAO.makePersistent(dummyEntity);

        //HERE SHOULD COME SESSION.FLUSH()

        int countAfter = dummyDAO.findAll().size();

        assertEquals(countBefore + 1, countAfter);
    }
}

Как видно между хранением и чтением данных, сеанс должен быть сброшен, поскольку по умолчанию FushMode равен AUTO, поэтому никакие данные не могут быть сохранены в БД.

Вопрос: Можно ли как-то установить FlushMode в ALWAYS на фабрике сеансов или где-то еще, чтобы избежать повторения вызова session.flush()?

Все вызовы БД в DAO выполняются с HibernateTemplateэкземпляр.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 20 ноября 2010

Попробуйте добавить следующее:

@Autowired
private SessionFactory sessionFactory;

@Before
public void myInitMethod(){
  sessionFactory.getCurrentSession().setFlushMode(FlushMode.ALWAYS);
}
1 голос
/ 31 января 2013

Согласно очистке объекта гибернации , очистка происходит по умолчанию в следующих точках:

  • до выполнения некоторых запросов
  • от org.hibernate.Transaction.commit ()
  • из Session.flush ()

Следовательно, перед вызовом dummyDAO.findAll().size(); объекты в сеансе уже сбрасываются в дБ. Установка FlushMode на ВСЕГДА не обязательна.

0 голосов
/ 29 октября 2010

Этого должно быть достаточно:

@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SimpleIntegrationTest extends AbstractTransactionalJUnit4SpringContextTests {

    @Autowired(required = true)
    private DummyDAO dummyDAO;

    @Test
    public void testPersistTestEntity() {
        assertEquals(0, dummyDAO.findAll().size());
        dummyDAO.makePersistent(new DummyEntity());
        assertEquals(1, dummyDAO.findAll().size());
    }
}

Из applicationContext.xml

<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>
    </property>
</bean>

Просмотреть источник TransactionalTestExecutionListener , если у вас есть вопросы о том, как транзакции работают вэтот сценарий.

Вы также можете использовать AOP (аспектно-ориентированное программирование) для прокси транзакций.

...