JPA - несколько банок, определяющих объекты @Entity
Мы разрабатываем веб-приложение для Spring, Hibernate и Maven в очень модульной форме. Существуют основные проекты, определяющие доступ к данным и просматривающие конкретные вещи, затем существуют модули, определяющие логику и объекты (@Entity
), а затем есть веб-приложение, определяющее контроллер и представление.
Теперь у нас есть модуль безопасности, определяющий объекты безопасности, такие как учетная запись и роль, и у нас есть модуль-прототип, определяющий некоторые примеры объектов, таких как клиент и заказ. У обоих есть PersistenceUnit
определены внутри persistence.xml
который в значительной степени пуст, за исключением имени PersistenceUnit, поскольку вся конфигурация базы данных выполняется в веб-приложении с помощью datasource.xml. Предполагается, что веб-приложение загружает обе банки в виде зависимостей maven.
Оба проекта будут работать нормально, автоматически сканируя все объекты и создавая их для соответствующих модульных тестов. Они также будут успешно загружены в веб-приложение, если они будут добавлены по отдельности.
Однако, как только оба загружаются одновременно, второй переопределит PersistenceUnit
первого и, таким образом, создать IllegalArgumentException : Not an entity
для всех сущностей из первого. Если оба проекта имеют разные единицы персистентности, загрузка веб-приложения вызовет еще одно исключение, сообщающее, что no single default persistence unit
определены.
Итак.. как я могу получить все @Entity
аннотированные классы для загрузки в моем веб-приложении без необходимости определять их все внутри persistence.xml
(как здесь) а скорее через компонентное сканирование? Это похоже на идею, хотя я не знаю, как ее использовать и проверить...
Я думаю, что мы должны либо объединить все элементы PersistenceUnits внутри веб-приложения, либо загрузить все объекты программно. Определение их жестко запрограммировано в файле persistence.xml - не вариант для нас.
5 ответов
Мы используем аналогичную компоновку модулей, но мы помещаем постоянный контекст в военную часть нашего приложения и внедряем управление данными в DAO модулей. За исключением модульного тестирования, модули не имеют PU. Мы сделали это, потому что боялись, что транзакция, охватывающая несколько модулей, может вызвать проблемы.
В ДАО
@PersistenceContext
private EntityManager em;
В файле persistance.xml необходимо включить все объекты с элементами.
<persistence-unit name="myPU">
<class>com.Entity1</class>
<class>com.Entity2</class>
и т.п.
Поскольку вопрос, кажется, все еще привлекает внимание, я опубликую наше последнее решение проблемы.
Теперь мы автоматически сканируем все пакеты, а не используем файлы persistence.xml в любом месте.
В нашем datasource.xml мы добавили строку
<property name="packagesToScan" value="our.basepackage" />
Почти полный datasource.xml:
<!-- Bean definition here -->
<bean id="ourDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!-- define connection properties -->
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="ourDataSource" />
<property name="packagesToScan" value="our.basepackage" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</bean>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
Ну, у нас похожая проблема в нашем цикле разработки. Если ваши ссылочные объекты находятся в другом файле -ejb.jar (это наш случай), вы можете связать эти объекты с помощью
<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>
тег. Обратите внимание, что вы также должны включить файл persistence.xml в dependent-entities-ejb.jar
Папка META-INF. Дополнительную информацию можно найти здесь.
Классы будут в загрузчике классов.
Это так ответит Сканирование аннотаций Java во время выполнения.
Это то, что вы хотите? Для сканирования @Entity
аннотировать и добавить их в PersistenceUnit
?
С уважением.
Я сделал решение, подобное tugcem, но поскольку я использую Maven, я не хотел бы иметь номера версий jar в моем файле persistence.xml. Решение, которое я придумал, описано здесь: JPA 2.0: автоматическое добавление классов сущностей в PersistenceUnit * из разных jar*