【问题标题】:Spring Boot Load orm.xmlSpring Boot 加载 orm.xml
【发布时间】:2015-11-10 19:47:11
【问题描述】:

我想将我的 Jpa 自定义映射外部化为 XML 文件。我已经看到了使用 orm.xml 的示例,但是当我在 resources/META-INF 中创建 orm.xml 时,它似乎没有被加载。我见过的所有示例都是通过 persistence.xml 加载的,而 Spring Boot 没有。我没有过多地寻找答案。如何让 Spring Boot 加载我的 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>

【问题讨论】:

    标签: java spring jpa orm spring-data-jpa


    【解决方案1】:

    是的。如果 orm.xml 存在于结果 jar 中的 META-INF 目录中,Spring Boot 应该默认加载它。
    否则,可以通过创建自定义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】:

      好的误报,Spring Boot 似乎默认加载它,但是我的 Intellij / Gradle 设置有另一个问题,它没有部署最新的构建 / WAR,因此它在没有 orm.xml 的情况下部署。我必须做一个 gradle clean,使 Intellij 中的缓存无效并重新启动。

      【讨论】:

        【解决方案3】:

        我在 2021 年遇到了同样的问题,情况发生了变化,即使包含在 persistence.xml 中,orm.xml 也不会加载。尝试随机的东西,感谢自动完成/代码辅助,我在 yaml 中找到了条目。 以下解决方案可帮助任何前来寻找答案的人节省时间。

        spring:
          jpa:
            mapping-resources:
            - META-INF/orm.xml
        

        【讨论】:

          猜你喜欢
          • 2014-10-08
          • 2016-03-04
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-21
          相关资源
          最近更新 更多