Как я могу убедиться, что все мои таблицы пусты с помощью HQL/Hibernate?

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

Итак, первое, что я хочу сделать в каждом из этих тестов, это проверить, действительно ли база данных пуста. Было бы полезно знать, что поломка вызвана утечкой, а не регрессией.

Я хотел бы знать, могу ли я сделать это с помощью одного запроса, потому что я бы не хотел делать и поддерживать что-то вроде:

sessionFactory.getCurrentSession().createQuery("Select a From A a").list().isEmpty()
...
sessionFactory.getCurrentSession().createQuery("Select z From Z z").list().isEmpty()

Я нашел это для mysql: Список непустых таблиц в базе данных MySQL но это конкретно.

Спасибо :)


person Maxime ARNSTAMM    schedule 14.02.2012    source источник


Ответы (2)


Что я делаю, так это настраиваю свой "hibernate.hbm2ddl.auto" для создания в файле hibernate.cfg.xml, и в каждом тесте я сбрасываю свой sessionfactory, используя

sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

Таким образом, база данных создается заново для каждого теста.

person bvanvelsen    schedule 14.02.2012
comment
это идея, но я боюсь, что на ее реализацию уйдет очень много времени. Если я не найду ничего другого, я протестирую ваше решение. - person Maxime ARNSTAMM; 14.02.2012
comment
@Maxime: не оптимизируй преждевременно - person bvanvelsen; 14.02.2012
comment
Это не мой код, это мои тесты. Я запускаю их при каждой сборке (surfire с тестом mvn), поэтому они не могут занимать слишком много времени. - person Maxime ARNSTAMM; 14.02.2012
comment
в любом случае, я тоже использую это решение, и когда моя БД предназначена только для тестирования, она довольно мала, тогда это работает довольно быстро... это работает для вас? - person bvanvelsen; 15.02.2012

Как насчет

session.createQuery("select 1 from table").setMaxSize(1).list().isEmpty()
person aviad    schedule 14.02.2012
comment
выбор 1 из таблицы будет извлекать данные из каждой таблицы в моей базе? - person Maxime ARNSTAMM; 14.02.2012
comment
замените его конкретным именем таблицы - person aviad; 14.02.2012
comment
я сказал в своем вопросе, что не хочу делать запрос по таблице, это болезненно и неудобно в обслуживании. - person Maxime ARNSTAMM; 14.02.2012