[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.jar에있는 엔터티를 검사하려면 persistence.xml에 포함해야합니다.
packedEntity.jar jar-file>. jar에있는 엔터티를 검사하려면 persistence.xml에 포함해야합니다.
packedEntity.jar jar-file>. 패키지에서 유닛을로드하려면 jar에서 직접 유닛을 주입 할 수 있습니다. @PersistenceContext (unitName = "../packedEntity.jar#main")
시도하지 않았지만 엔터티에 대해 최대 절전 자동 검색을 사용하도록 설정할 수 있습니다.
-
==============================
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.스프링 부트를 사용하는 경우 기본 springboot 클래스의 엔티티 스캔 주석을 사용하십시오
스프링 부트를 사용하는 경우 기본 springboot 클래스의 엔티티 스캔 주석을 사용하십시오
@EntityScan( basePackageClasses = {externalpackage.classname.class} )
from https://stackoverflow.com/questions/9504824/loading-jpa-entity-from-external-jar-file by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 구성 파일에서 플러시 모드를 "COMMIT"으로 설정하려면 어떻게합니까? (0) | 2019.02.15 |
---|---|
[SPRING] wildfly 10의 HTTP 요청을 https로 리디렉션합니다. (0) | 2019.02.15 |
[SPRING] 메소드의 @ModelAttribute (0) | 2019.02.15 |
[SPRING] Thymeleaf에서 객체의 메서드를 호출하는 방법? (0) | 2019.02.15 |
[SPRING] jsf managed beans에 @autowire하는 방법 (0) | 2019.02.15 |