Загрузка объекта JPA из внешнего файла Jar - PullRequest
7 голосов
/ 29 февраля 2012

У меня есть настройка проекта, в которой я модульно проектировал и упаковал модуль в файл jar, который включается в основной проект, когда мы создаем войну и разворачиваем ее.Проблема, с которой я сталкиваюсь, состоит в том, что у меня есть Entity, присутствующий в модуле, который не загружается, когда контейнер JPA EntityManagerFactory для unitName создается во время запуска.

Основной вопрос, который у меня возникает, заключается в том, не ищет ли EntityManager файл persistence.xml, затем загружает указанные свойства и затем сканирует все пакеты на наличие аннотации @Entity?

Было бы замечательно понять, как это работает и как я могу решить эту проблему.

Я нашел эту ссылку, и она упоминает о создании отдельных модулей персистентности, но здесь мне не нужен отдельный блок персистентности.Мне просто нужен модуль, чтобы вернуться к родительскому проекту и загрузить сущность и любые другие классы @Resource, @Component, что он делает из-за контекста: компонентное сканирование и конфигурация аннотации.

http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence-units.html

Вот мой код / ​​конфигурация

<bean id="entityManagerFactory"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="LineManagement" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform" ref="cpsHibernateDialectClassName" />
        </bean>
    </property>
    <property name="beanName" value="entityManager"></property>
</bean>

определение EnitityManagerFactory для запуска Entity Manager.

<persistence-unit name="LineManagement" transaction-type="RESOURCE_LOCAL">
    <properties>
        <property name="hibernate.id.new_generator_mappings" value="true" />
        <property name="hibernate.current_session_context_class" value="thread" />
        <property name="hibernate.default_batch_fetch_size" value="200" />

....

Persistence.xml, который определяет кэш второго уровня и другие свойства гибернации.

Затем модуль, имеющий сущность.

import javax.persistence.Entity;


@Entity
@Table(name = IntegrationEvent.TABLE_NAME, uniqueConstraints =    @UniqueConstraint(columnNames = "INTGRTN_EVNT_QUEUE_SK"))
@GenericGenerator(name = "UUID_GEN", strategy = "org.hibernate.id.UUIDHexGenerator",     parameters = { @Parameter(name = "separator", value = "-") })
public class IntegrationEvent implements Serializable {

....}

Примечание: сущность находится в другом пакете, чем родительский, так как онаэто отдельный модуль самостоятельно.

Сущность, которая прекрасно загружается в основном проекте.

package com.parent.line.entity;

import javax.persistence.Entity;

@Entity
@Table(name = "ACCOUNT")
@Cacheable(true)
public class Account
  implements LMLookupTypeEntityByDivision, Serializable, Comparable<Account> {

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Для сканирования объектов, находящихся в jar, вы должны включить его в файл persistence.xml.<jar-file>packedEntity.jar</jar-file>.

Если вы хотите загрузить устройство из упаковки, вы можете попробовать напрямую ввести его из банки.@PersistenceContext(unitName = "../packedEntity.jar#main")

Не пробовал, но вы можете включить автообнаружение гибернации для сущностей <property name="hibernate.archive.autodetection" value="class, hbm"/>

2 голосов
/ 12 октября 2017

если вы используете весеннюю загрузку, используйте аннотацию проверки сущности в вашем основном классе весенней загрузки

@EntityScan(
        basePackageClasses = {externalpackage.classname.class}
)
1 голос
/ 01 марта 2012

На работе мы используем не JPA, а Hibernate, и наш проект полностью модульный. Мы работаем примерно с 30 странами, которые не используют одни и те же модули, и мы можем загрузить все сущности этих модулей в фабрике сеансов, просто изменив зависимости maven (нет файла orm для изменения)

Используемое решение состоит в том, чтобы использовать Java SPI. ServiceLoader будет искать классы, которые реализуют базовый интерфейс EntityProvider. Каждый EntityProvider каждого модуля будет жестко кодировать сущности, которые он приносит, и возвращать список сущностей при вызове ServiceLoader.load (EntityProvider.class). Таким образом, в ядре платформы нам просто нужно создать фабрику сеансов на основе пружины, в которой мы предоставляем список сущностей с помощью фабричного компонента, который будет вызывать SPI.

Я не знаю, будет ли это легко с JPA, но я уверен, что это возможно, но вам может понадобиться создать вручную ЭДС из весеннего контекста, а также, вероятно, PersistenceUnit ... Что вы можете захотеть является единицей постоянства, которая является «объединением» единиц постоянства всех ваших модулей (по крайней мере, для ваших сущностей) Взгляните на SPI, а также на пакет javax.persistence.spi.

Проверьте также, как создать EMF с помощью Spring: AbstractEntityManagerFactoryBean

Редактировать: вы можете проверить это: , используя MergingPersistenceUnitManager для загрузки сущности

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