JPA - несколько банок, определяющих объекты @Entity - PullRequest
23 голосов
/ 16 сентября 2011

Мы разрабатываем веб-приложение для Spring, Hibernate и Maven в очень модульной форме.Есть основные проекты, определяющие доступ к данным и просматривающие определенные вещи, затем есть модули, определяющие логику и сущности (@Entity), и затем есть веб-приложение, определяющее контроллер и представление.

Теперь у нас есть модуль безопасности, определяющий безопасностьсущности, такие как account и role, и у нас есть модуль-прототип, определяющий некоторые примерные сущности, такие как customer и order.Оба имеют PersistenceUnit, определенный внутри persistence.xml, который в значительной степени пуст, за исключением имени PersistenceUnit, поскольку вся конфигурация базы данных выполняется в веб-приложении с помощью datasource.xml.Предполагается, что веб-приложение загружает оба jar-файла в виде зависимостей maven.

Оба проекта будут нормально работать, автоматически сканируя все объекты и создавая их для соответствующих модульных тестов.Они также будут успешно загружены в веб-приложение, если они будут добавлены по отдельности.

Однако, как только оба загружаются одновременно, второй переопределит PersistenceUnit первого и, таким образом, создаст IllegalArgumentException : Not an entity для всех сущностей из первого.Если оба проекта имеют разные единицы сохраняемости, загрузка веб-приложения вызовет еще одно исключение, в котором будет указано no single default persistence unit.

Итак ... как я могу получить все @Entity аннотированные классы для загрузки в моем веб-приложениибез необходимости определять их все внутри persistence.xml (например, здесь ), а скорее через компонентное сканирование? Это кажется идеей, хотя я не знаю, как его использовать и протестировать ...

Я думаю, что нам нужно либо объединить все элементы PersistenceUnits внутри веб-приложения, либо загрузить все сущностипрограммно.Определение их жестко закодировано в файле persistence.xml для нас не вариант.

Ответы [ 5 ]

4 голосов
/ 27 марта 2014

Поскольку вопрос, похоже, все еще привлекает внимание, я опубликую наше последнее решение проблемы.

Сейчас мы автоматически сканируем все пакеты вместо использования файлов 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" />

4 голосов
/ 16 сентября 2011

Мы используем похожую компоновку модулей, но мы помещаем постоянный контекст в боевую часть нашего приложения и внедряем управляющий объект в DAO модулей.За исключением модульного тестирования, модули не имеют PU.Мы сделали это, потому что боялись, что транзакция, охватывающая несколько модулей, может вызвать проблемы.

В DAO

@PersistenceContext
private EntityManager em;

В файле persistance.xml необходимо включить все сущности с элементами.

<persistence-unit name="myPU">
    <class>com.Entity1</class>      
<class>com.Entity2</class>

и т. Д.

3 голосов
/ 21 марта 2012

Ну, у нас похожая проблема в нашем цикле разработки. Если ваши ссылочные объекты находятся в другом файле -ejb.jar (это наш случай), вы можете связать эти объекты с помощью

<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>

бирка. Обратите внимание, что вы также должны включить persistence.xml в папку dependent-entities-ejb.jar META-INF . Дополнительную информацию можно найти здесь .

3 голосов
/ 16 сентября 2011

Классы будут в загрузчике классов.

Это так ответ Сканирование аннотаций Java во время выполнения .

Это то, что вы хотите?Сканировать на @Entity с комментариями и добавлять их в PersistenceUnit?

С уважением.

0 голосов
/ 26 марта 2014

Я создал решение, подобное tugcem, но поскольку я использую Maven, я не хотел бы иметь номера версий jar в моем файле persistence.xml. Решение, которое я придумал, описано здесь: JPA 2.0: автоматическое добавление классов сущностей в PersistenceUnit * из разных jar *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...