Использование отдельных файлов persistence.xml для производства и тестирования с Spring 3.1

Хорошо, извините, я часами искал ответы на этот вопрос, но мне потребовалось ввести весь вопрос для StackOverflow, чтобы всплыть ссылка, которую я искал. Вы можете прочитать много актуальной информации здесь .


У меня есть проект Spring, созданный с помощью Spring Roo для использования Hibernate и MySQL. Однако для тестирования я хочу использовать HSQLDB в памяти, потому что тесты интеграции Roo удаляют данные с идентификаторами (первичными ключами )от 0 до 10 (, а не удаляют данные, используя идентификаторы, назначенные базой данных для данных, которые они уже created), что означает, что он удаляет данные, которые уже находятся в базе данных, что в моем случае вызывает нарушение ограничения, прежде чем он успеет откатить транзакцию.

Это немного сложнее, потому что я полностью переключаю поставщиков баз данных, что означает разные диалекты Hibernate, а также разные настройки DDL (, которые проверяются в производственной среде, создаются-отбрасываются в тесте). Но это не работает, как я ожидаю, и я не понимаю, почему.

Если вы знаете, почему это не работает, скажите об этом, даже если у вас нет решения.

Поскольку это проект Roo, я, конечно, использую Maven. Итак, первое, что я попробовал, это иметь тестовый-специфический src/test/resources/META-INF/persistence.xmlфайл, а также тестовый-специфический файл src/test/resources/META-INF/spring/database.properties. Это не сработало, так как когда я запустил mvn test, все сломалось с соответствующим сообщением

Conflicting persistence unit definitions for name 'persistenceUnit'

Почему mvn testвсе еще собирал не-тестовые ресурсы?

Затем я переименовал src/test/resources/META-INF/springв spring-testи скопировал в него applicationContext.xml. Я изменил конфигурацию контекста в тестовых классах на

@ContextConfiguration(locations = "classpath:/META-INF/spring-test/applicationContext*.xml")

Завершение (или так я думал )разделение,Я внес пару правок вspring-test/applicationContext.xml:

Изменил путь к файлам свойств:


на


Изменил имя единицы сохраняемости:


    
    

на


    
    

И сделал соответствующее изменение в имени единицы сохраняемости наsrc/test/resources/META-INF/persistence.xml

Хорошо, теперь конфликта нет, но Hibernate каким-то образом потерял сопоставления сущностей (, например для сущности Product), и я получаю :

org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.hql.ast.QuerySyntaxException: Product is not mapped [SELECT o FROM Product o]; 

. Почему Spring/Hibernate потерял сопоставления сущностей в этой конфигурации?

Итак, следующее, что я попробовал, — это объединить два файла persistence.xml, чтобы один файл под src/main/resources/META-INFвключал обе единицы персистентности.

Это работает!!??

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

Как лучше?

Насколько я понимаю, свойства недоступны в файле persistence.xml так, как они доступны в XML-файлах Spring. Так что я не думаю, что смогу делать то, что хочу, только с тестовым-файлом свойств.

В идеале я бы запускал тесты, используя всю конфигурацию из src/main/resources, за исключением того, что специально переопределено в src/test/resources. Есть ли способ сделать это?

Спасибо за любую информацию, которую вы можете предоставить!

6
задан Community 23 May 2017 в 12:22
поделиться