如何使用 Spring Boot 2.0 指定 Hibernate 映射?

Posted

技术标签:

【中文标题】如何使用 Spring Boot 2.0 指定 Hibernate 映射?【英文标题】:How to specifiy Hibernate mappings with Spring Boot 2.0? 【发布时间】:2017-10-17 07:31:21 【问题描述】:

在 Spring Boot 1.x 中,我们可以通过扩展 HibernateJpaAutoConfiguration、覆盖 LocalContainerEntityManagerFactoryBean bean 并设置映射资源 like in this answer 来指定休眠映射文件。

自 Spring Boot 2.0(确切地说是 2.0.0.M5)以来,我们不能再这样做了,因为 HibernateJpaAutoConfiguration 已更改(使用 this commit)并且我们无法扩展 HibernateJpaConfiguration,因为它是包保护的.

您知道使用 Spring Boot 2.0 指定休眠映射文件的另一种方法吗?

谢谢!

【问题讨论】:

Spring Boot 出现问题:github.com/spring-projects/spring-boot/issues/10684 【参考方案1】:

从 Spring Boot 2.0.0.M6 开始,您应该使用新的 spring.jpa.mapping-resources 属性来定义自定义映射,而不是覆盖 Spring Boot 的内部。

YML 中的示例: spring: jpa: mapping-resources: - db/mappings/dummy.xml

如需完整示例,请查看application.yml configuration file of this repository。

【讨论】:

我一直在通过扫描类路径来动态添加映射,而这种方法无法做到这一点。 是否可以使用通配符以便不必在配置中明确列出单个文件?【参考方案2】:
private String[] loadResourceNames() 
    Resource[] resources = null;
    List<String> names = new ArrayList<String>();

    try 
        resources = ResourcePatternUtils.getResourcePatternResolver(resourceLoader).getResources("classpath: *.hbm.xml");

    
        for ( Resource resource : resources ) 
               names.addAll( Files.list( resource.getFile().toPath() )
                                       .map ( path -> path.getFileName().toString() )
                                       .filter ( p -> p.endsWith( "hbm.xml") )  
                                       .map ( p -> "your directory on class path".concat(p) ) 
                                       .collect ( Collectors.toList() ) );

            
        catch(IOException e)
            e.printStackTrace();
        
    
    System.out.println(resources);
    return names.toArray(new String[names.size()]);


@Primary
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource,EntityManagerFactoryBuilder builder) 
    Properties properties = new Properties();
    properties.put("hibernate.dialect","org.hibernate.dialect.H2Dialect");
    properties.put("hibernate.format_sql","true");
    properties.put("hibernate.show_sql","true");
    //properties.put("hibernate.current_session_context_class","thread");
    properties.put("hibernate.hbm2ddl.auto","create");
    properties.put("hibernate.ddl-auto","create");
    
    return builder
            .dataSource(dataSource)
            .packages("edu.balu.batch.migration.dataloadccp.model.target")
            .properties(new HashMap(properties))
            .mappingResources(loadResourceNames())
            .build();

【讨论】:

嗨,巴鲁。感谢您的回答。通常,提供几句话来解释解决方案可能很有用。

以上是关于如何使用 Spring Boot 2.0 指定 Hibernate 映射?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.0:使用 Docker 部署 Spring Boot 开源软件云收

如何使用 JOOQ 和 Spring-boot 2.0 进行手动事务管理?

如何使用 spring boot 2.0 配置 redis ttl

如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台

如何将项目迁移至 Spring Boot 2.0 ?

Spring Boot 2.0:Spring Boot 如何解决项目启动时初始化资源