I have a Spring/Hibernate webapp that has some integration tests that run on an in-memory HSQL database. Hibernate takes this blank database and creates all of my test tables and constraints thanks to hbm2ddl=create. However, I have a new bean that checks for a particular config value from the database during its afterPropertiesSet() method, and so when this bean is initialized, such a row needs to exist in the database.
Is there any good way to set up a Java/Spring/Hibernate equivalent of Rail's test fixtures? I'm trying to find a way to tell Hibernate "whenever you create this table, insert these rows immediately afterwards". I couldn't find a callback or a hook I could add, but maybe there's another way.
Я пытаюсь найти способ сообщить Hibernate «всякий раз, когда вы создаете эту таблицу, вставляйте эти строки сразу же после этого»
Начиная с Hibernate 3.1, вы можете включить файл с именем import.sql
в путь к классам среды выполнения Hibernate, и во время экспорта схемы Hibernate будет выполнять операторы SQL, содержащиеся в этом файле, после того, как схема была экспортирована.
Эта функция была анонсирована в Rotterdam JBug и сообщении в блоге import.sql Hibernate:
import.sql: легко импортировать данные в модульные тесты
Hibernate имеет небольшую изящную функцию это в значительной степени недостаточно документировано и неизвестный. Вы можете выполнить сценарий SQL во время создания
SessionFactory
сразу после схемы базы данных генерация для импорта данных в свежем база данных. Вам просто нужно добавить файл с именемimport.sql
в вашем пути к классам root и установите либоcreate
, либоcreate-drop
как вашhibernate.hbm2ddl.auto
свойство.Я использую его для поиска гибернации в Действие теперь, когда я начал запросить главу. Он инициализирует мой база данных со свежим набором данных для мои модульные тесты. JBoss Seam также использует его много в различных примерах.
import.sql
- очень простая функция но время от времени весьма полезно. Помните что SQL может зависеть от ваша база данных (ах переносимость!).# файл import.sql удалить из ПРОДУКТОВ вставить в ПРОДУКТЫ (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) значения ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair бла-бла ...'); вставить в ПРОДУКТЫ (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) значения ('2', 'B00003CXCD', 'Roman Holiday', 12.98, 'B00003CXCD.jpg', 'Мы могли бы спорить, что бла-бла');
Для получения дополнительной информации об этом функция, проверьте блог Эяля , он написал об этом небольшую приятную запись. Помните, хотите ли вы добавить дополнительные объекты базы данных (индексы, таблицы и так далее), вы также можете использовать вспомогательные особенность объектов базы данных.
Это все еще не задокументировано.
Если вы говорите о тестах JUnit и используете AbstractTransactionalDataSourceSpringContextTests , вы можете переопределить методы, такие как onSetupBeforeTransaction , которые предоставляют возможность предварительного заполнения данных тестовой таблицы и т. Д.