Spring-boot - 将 hibernate 映射文件添加到实体管理器

ika*_*ane 7 java hibernate jpa spring-boot

我正在将遗留应用程序迁移到 Spring-boot,并且必须集成一个 hibernate 命名查询映射文件(之前在 persistence.xml 文件中配置)。

我想出了一个解决方案

...
@Autowired
private DataSource dataSource;

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);

    //...

    sessionFactoryBean.setMappingResources("META-INF/named-queries.hbm.xml");

    return sessionFactoryBean;
}   
Run Code Online (Sandbox Code Playgroud)

但我的应用程序中将不再有一个entityManager bean 和一个sessionFactory bean!

您认为这是一个好的解决方案吗?有没有办法以某种方式将休眠映射文件(named-query.hbm.xml)添加到entityManager而不使用sessionFactory bean?

预先感谢您的建议

** 编辑 ** JB Nizet 的建议,还提出了另一个解决方案

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

    entityManagerFactory.setDataSource(dataSource);

    // ...

    entityManagerFactory.setMappingResources("META-INF/named-queries.hbm.xml");

    return entityManagerFactory;
}
Run Code Online (Sandbox Code Playgroud)

在我的 DAO/服务中,我仍然可以通过以下方式获得休眠会话:

private Session getSession() {
        //return this.sessionFactory.getCurrentSession();
        return this.entityManager.unwrap(Session.class);
    }
Run Code Online (Sandbox Code Playgroud)

但是如果现在有人知道我们是否可以使用带有属性的 spring-boot 自动配置来做同样的事情,那么我们将受到欢迎!

Ray*_*hiu 7

将 *.hbm.xml 文件放在 src/main/resources 文件夹下,Spring Boot 可以自动扫描它们。

如果要在 application.properties 文件中指定位置,请将它们定义到 spring.jpa.mapping-resources 属性。

spring.jpa.mapping-resources=hibernate/MyMapping.hbm.xml,hibernate/MyMapping2.hbm.xml
Run Code Online (Sandbox Code Playgroud)

在SpringBoot 2.1.3中测试,以下是文件夹结构

src/main/resources/hibernate : Store all the *.hbm.xml files
src/main/resources/application.properties : define the spring boot properties
Run Code Online (Sandbox Code Playgroud)

如果您想在 Dao 类中获取 hibernate 会话,请按如下方式定义它们:

spring.jpa.mapping-resources=hibernate/MyMapping.hbm.xml,hibernate/MyMapping2.hbm.xml
Run Code Online (Sandbox Code Playgroud)


小智 0

@Autowired
private ResourceLoader rl;


@Bean
public LocalSessionFactoryBean sessionFactory() throws IOException {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setMappingLocations(loadResources());
}

public Resource[] loadResources() {
    Resource[] resources = null;
    try {
        resources = ResourcePatternUtils.getResourcePatternResolver(rl)
            .getResources("classpath:/hibernate/*.hbm.xml");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return resources;
}
Run Code Online (Sandbox Code Playgroud)