복붙노트

[SPRING] 봄 부팅로드 orm.xml

SPRING

봄 부팅로드 orm.xml

Jpa에 대한 사용자 지정 매핑을 XML 파일로 외부화하려고합니다. orm.xml을 사용하는 예제를 보았지만 resources / META-INF에 orm.xml을 작성할 때로드되지 않는 것으로 나타납니다. 필자가 본 모든 예제는 Spring Boot가없는 persistence.xml을 통해로드됩니다. 나는 대답을 많이 찾지 않았다. Spring 부트가 orm.xml 파일을로드하게하려면 어떻게해야합니까?

예제 orm.xml

<entity-mappings version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
    http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
<sql-result-set-mapping name="AuthorMappingXml">
    <entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
        <field-result name="id" column="authorId"/>
        <field-result name="firstName" column="firstName"/>
        <field-result name="lastName" column="lastName"/>
        <field-result name="version" column="version"/>
    </entity-result>
</sql-result-set-mapping>
<sql-result-set-mapping name="AuthorBookCountMappingXml">
    <entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
        <field-result name="id" column="id"/>
        <field-result name="firstName" column="firstName"/>
        <field-result name="lastName" column="lastName"/>
        <field-result name="version" column="version"/>
    </entity-result>
    <column-result name="bookCount" class="java.lang.Long" />
</sql-result-set-mapping>
<sql-result-set-mapping name="BookAuthorMappingXml">
    <entity-result entity-class="org.thoughts.on.java.jpa.model.Author">
        <field-result name="id" column="authorId"/>
        <field-result name="firstName" column="firstName"/>
        <field-result name="lastName" column="lastName"/>
        <field-result name="version" column="authorVersion"/>
    </entity-result>
    <entity-result entity-class="org.thoughts.on.java.jpa.model.Book">
        <field-result name="id" column="id"/>
        <field-result name="title" column="title"/>
        <field-result name="author" column="author_id"/>
        <field-result name="version" column="version"/>
    </entity-result>
</sql-result-set-mapping>
<sql-result-set-mapping name="BookValueMappingXml">
    <constructor-result target-class="org.thoughts.on.java.jpa.value.BookValue">
        <column name="id" class="java.lang.Long"/>
        <column name="title"/>
        <column name="version" class="java.lang.Long"/>
        <column name="authorName"/>
    </constructor-result>
</sql-result-set-mapping>
</entity-mappings>

해결법

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

    1.네. orm.xml이 result jar의 META-INF 디렉토리에 존재하면 스프링 부트가 기본적으로로드해야합니다. 그렇지 않으면 아래와 같이 사용자 정의 LocalContainerEntityManagerFactoryBean을 작성하여 수동으로로드 할 수 있습니다.

    네. orm.xml이 result jar의 META-INF 디렉토리에 존재하면 스프링 부트가 기본적으로로드해야합니다. 그렇지 않으면 아래와 같이 사용자 정의 LocalContainerEntityManagerFactoryBean을 작성하여 수동으로로드 할 수 있습니다.

    Application.properties

    spring.jpa.orm=orm.xml
    

    DBConfig.java (Hibernate를 영속성 공급자로 사용할 경우)

    @Configuration
    public class DBConfig extends HibernateJpaAutoConfiguration {
    
    @Value("${spring.jpa.orm}")
    private String orm;
    
    @SuppressWarnings("SpringJavaAutowiringInspection")
    public DBConfig(DataSource dataSource, JpaProperties jpaProperties, ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider) {
        super(dataSource, jpaProperties, jtaTransactionManagerProvider);
    }
    
    @Override
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder factoryBuilder)
    {
        final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = super.entityManagerFactory(factoryBuilder);
        entityManagerFactoryBean.setMappingResources(orm);
        return entityManagerFactoryBean;
    }
    
    }
    

    엔티티가 깨끗하게 유지되는 동안 모든 매핑을 외부 XML 파일로 옮기는 것이 매우 유용하다는 것을 발견했습니다.

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

    2.오케이 거짓 경보, 스프링 부트가 기본적으로로드되지만 내 Intellij / Gradle 설치에는 orm.xml없이 배포되도록 최신 빌드 / WAR를 배치하지 않는 또 다른 문제점이 있습니다. 내가 gradle 깨끗하게하고 Intellij에서 캐시를 무효화하고 다시 시작했다.

    오케이 거짓 경보, 스프링 부트가 기본적으로로드되지만 내 Intellij / Gradle 설치에는 orm.xml없이 배포되도록 최신 빌드 / WAR를 배치하지 않는 또 다른 문제점이 있습니다. 내가 gradle 깨끗하게하고 Intellij에서 캐시를 무효화하고 다시 시작했다.

  3. from https://stackoverflow.com/questions/32062828/spring-boot-load-orm-xml by cc-by-sa and MIT license