복붙노트

[SPRING] 외부 JAR 파일에서 JPA Entity로드

SPRING

외부 JAR 파일에서 JPA Entity로드

나는 프로젝트를 모듈화하여 프로젝트를 만들고, 모듈을 jar 파일에 패키지화했다.이 모듈은 전쟁을 만들고 배포 할 때 주 프로젝트에 포함된다. 내가 직면하고있는 문제는, 내가 시작하는 동안 unitName에 대한 JPA 컨테이너 EntityManagerFactory가 빌드 될 때로드되지 않는 모듈에 Entity가 있다는 것입니다.

필자가 가지고있는 기본적인 질문은 EntityManager가 persistence.xml을 검색하지 않고 지정된 속성을로드 한 다음 @Entity 주석을 위해 모든 패키지를 검사한다는 것입니다.

어떻게 작동하는지 그리고 어떻게 해결할 수 있는지에 대한 통찰력은 아주 좋습니다.

이 링크를 발견하고 별도의 persistenceUnits를 작성하는 것에 대해 언급하지만 여기서는 별도의 지속성 단위가 필요하지 않습니다. 모듈을 부모 프로젝트로 가져 와서 엔티티와 다른 @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>

Entity Manager를 시작하기위한 EnitityManagerFactory의 정의.

<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은 2 차 레벨 캐시와 기타 최대 절전 모드 속성을 정의합니다.

그런 다음 엔티티가있는 모듈.

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> {

해결법

  1. ==============================

    1.jar에있는 엔터티를 검사하려면 persistence.xml에 포함해야합니다.   packedEntity.jar .

    jar에있는 엔터티를 검사하려면 persistence.xml에 포함해야합니다.   packedEntity.jar .

    패키지에서 유닛을로드하려면 jar에서 직접 유닛을 주입 할 수 있습니다. @PersistenceContext (unitName = "../packedEntity.jar#main")

    시도하지 않았지만 엔터티에 대해 최대 절전 자동 검색을 사용하도록 설정할 수 있습니다.

  2. ==============================

    2.직장에서 우리는 JPA를 사용하지 않고 Hibernate를 사용하며 프로젝트는 완전히 모듈화되어 있습니다. 우리는 같은 모듈을 사용하지 않는 약 30 개 국가를 다루고 있으며, 단순히 maven 종속성을 변경함으로써 세션 팩토리에이 모듈의 모든 엔티티를로드 할 수 있습니다 (수정하지 않을 orm 파일)

    직장에서 우리는 JPA를 사용하지 않고 Hibernate를 사용하며 프로젝트는 완전히 모듈화되어 있습니다. 우리는 같은 모듈을 사용하지 않는 약 30 개 국가를 다루고 있으며, 단순히 maven 종속성을 변경함으로써 세션 팩토리에이 모듈의 모든 엔티티를로드 할 수 있습니다 (수정하지 않을 orm 파일)

    사용 된 솔루션은 Java SPI를 사용하는 것입니다. ServiceLoader는 핵심 인터페이스 인 EntityProvider를 구현하는 클래스를 검색합니다. 모든 모듈의 각 EntityProvider는 가져 오는 엔티티를 하드 코드하고 ServiceLoader.load (EntityProvider.class)를 호출 할 때 엔티티 목록을 반환합니다. 따라서 플랫폼 코어에서 SPI를 호출 할 factory bean에 의해 엔티티리스트를 제공하는 스프링 기반 세션 팩토리를 생성하면됩니다.

    나는 그것이 JPA로는 쉬울 지 모르겠지만, 가능하다는 것을 확신하지만 스프링 컨텍스트에서 EMF를 수동으로 생성해야 할 수도 있고 PersistenceUnit에서 추측 할 수도 있습니다 ... 원하는 것은 지속성입니다. 모든 모듈의 영속성 단위의 "병합"인 단위 (적어도 엔티티의 경우) SPI와 javax.persistence.spi 패키지를 살펴보십시오.

    Spring에서 EMF를 생성하는 방법도 확인하십시오. AbstractEntityManagerFactoryBean

    편집 : 당신이 확인할 수 있습니다 : MergingPersistenceUnitManager를 사용하여 엔티티를로드

  3. ==============================

    3.스프링 부트를 사용하는 경우 기본 springboot 클래스의 엔티티 스캔 주석을 사용하십시오

    스프링 부트를 사용하는 경우 기본 springboot 클래스의 엔티티 스캔 주석을 사용하십시오

    @EntityScan(
            basePackageClasses = {externalpackage.classname.class}
    )
    
  4. from https://stackoverflow.com/questions/9504824/loading-jpa-entity-from-external-jar-file by cc-by-sa and MIT license