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*

Другие вопросы по тегам