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 внутри веб-приложения или загрузить все Entities программно. Определение их жестко закодированных внутри persistence.xml не является для нас вариантом.
Ответы
Ответ 1
Мы используем аналогичный макет модуля,
но мы помещаем контекст персистентности в военную часть нашего приложения и вводим entitymanager в DAO модулей.
За исключением модульных испытаний,
модули не имеют PU.
Мы сделали это, потому что боялись,
что транзакция, охватывающая несколько модулей, может вызвать проблемы.
В DAO
@PersistenceContext
private EntityManager em;
В файле persistance.xml вам нужно заручиться всеми объектами с элементами.
<persistence-unit name="myPU">
<class>com.Entity1</class>
<class>com.Entity2</class>
и др.
Ответ 2
Поскольку вопрос, похоже, все еще привлекает внимание, я опубликую наше последнее решение проблемы.
Теперь мы автоматически сканируем все пакеты вместо использования файлов 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" />
Ответ 3
Классы будут находиться в загрузчике классов.
Это так ответьте Сканирование аннотаций Java во время выполнения.
Это то, что вы хотите? Сканировать для @Entity
аннотированные и добавить их в PersistenceUnit
?
С уважением.
Ответ 4
Хорошо, у нас есть аналогичная проблема в нашем цикле разработки. Если ваши референтные объекты находятся в другом файле -ejb.jar(это наш случай), вы можете связать эти объекты с помощью
<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>
тег. Обратите внимание, что вы также должны включить persistence.xml в папку dependent-entities-ejb.jar
META-INF. Более подробную информацию можно найти здесь.
Ответ 5
Я сделал такое решение, как tugcem, но потому, что я использую Maven, мне бы не хотелось иметь номера версии jar в моем файле persistence.xml. Решение, которое я придумал, описано здесь: JPA 2.0: добавление классов сущностей в PersistenceUnit * из разных jar * автоматически