РЕДАКТИРОВАТЬ: хотя был дан и присужден (хороший) ответ, он охватывает лишь довольно незначительную часть моего вопроса. Основные части этого вопроса остаются открытыми.
Я использую EclipseLink (2.6.2) в облачном проекте. Проект представляет собой веб-приложение, упакованное в виде файла WAR
и развернутое на Apache Tomcat 8. Контекст персистентности настраивается с помощью кода Java, где я указываю сущности для использования с помощью entityManagerFactoryBean.setPackagesToScan(packagesToScan)
. Эта конфигурация обычно работает так, как ожидается, где точно находятся классы сущностей в указанных пакетах.
Теперь я не понимаю, когда использовать какой загрузчик классов, особенно при рассмотрении Tomcat, выполнении тестов и использовании различных реализаций пула соединений.
При работе на Apache Tomcat, включая пул соединений Tomcat, экземпляр DataSource
создается с помощью подключаемого модуля spring-cloud-connector
(spring-cloud-spring-service-connector
). В этом параметре все работает так, как ожидалось, пока я не изменю загрузчик классов, как описано ниже (в противном случае я столкнусь с ClassNotFoundException
s для классов сущностей).
При выполнении модульных тестов с помощью JUnit
и spring-test
экземпляр DataSource
создается с использованием базы данных H2 в памяти (используя EmbeddedDatabaseBuilder
из spring-jdbc
). В этом параметре я должен указать JPA для использования загрузчика классов, используемого для экземпляра DataSource
(ключ eclipselink.classloader
на карте свойств JPA), иначе я получаю «Объект... не является известным типом объекта».
При выполнении тестов во встроенном Apache Tomcat 8 я не вижу никаких сообщений, указывающих на используемый пул соединений. В этом параметре я также должен установить загрузчик классов для модульных тестов.
Если я добавлю commons-dbcp
(2.1.1) в свой проект и явно настрою подключаемый модуль spring-cloud-connector
для использования его вместо пула соединений Tomcat, я смогу запустить приложение на Tomcat без настройки загрузчика классов, но оно также работает с описанной выше спецификацией загрузчика классов.
Для тестов commons-dbcp
ничего не меняет по сравнению со сценариями, описанными выше (поскольку соответствующая конфигурация не используется).
Резюме:
- Tomcat (Tomcat CP): использование только немодифицированного загрузчика классов для JPA
- Tomcat (DBCP): оба варианта
- Тесты: использование только загрузчика классов
DataSource
для JPA
Не могли бы вы помочь мне понять различия здесь и предложить простое решение, подходящее для всех случаев? Я предполагаю, что DBCP и Spring используют другой загрузчик классов, чем Tomcat (и пул соединений Tomcat).
Если вам нужна дополнительная информация, я с радостью добавлю ее.
РЕДАКТИРОВАТЬ: я добавил пример проекта с большим README о том, как воспроизвести.