【问题标题】:Spring-boot - add hibernate mapping file to entity managerSpring-boot - 将休眠映射文件添加到实体管理器
【发布时间】:2015-12-08 18:23:48
【问题描述】:

我正在将遗留应用程序迁移到 Spring-boot,并且必须集成一个名为查询映射的休眠文件(之前在 persitence.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;
}   

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

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

提前感谢您的建议

** 编辑 ** 根据 JB Nizet 的建议,也想出另一个解决方案

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

    entityManagerFactory.setDataSource(dataSource);

    // ...

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

    return entityManagerFactory;
}

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

private Session getSession() {
        //return this.sessionFactory.getCurrentSession();
        return this.entityManager.unwrap(Session.class);
    }

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

【问题讨论】:

  • 您可以使用实体 java 文件上的注释来放置命名查询。
  • 为什么不在LocalContainerEntityManagerFactoryBean上设置映射资源呢? docs.spring.io/spring/docs/current/javadoc-api/org/…
  • @Jay 感谢您回复 Jay。如前所述,我使用的是旧代码,我必须按原样集成映射文件。
  • @JBNizet 感谢您的建议 JB。是否可以使用 spring-boot 属性(和自动配置机制)设置映射资源,还是我必须自己定义 LocalContainerEntityManagerFactoryBean
  • persistence.xml. 中定义您的 mapping-file,并放弃自定义配置的。或者将您的 named-queries.hbm.xml 迁移到 orm.xml(此文件的 JPA 等效项)并将其放在 META-INF 中,它将自动加载。

标签: java hibernate jpa spring-boot


【解决方案1】:

将 *.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

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

src/main/resources/hibernate : Store all the *.hbm.xml files
src/main/resources/application.properties : define the spring boot properties

如果你想在你的 Dao 类中获得休眠会话,请按如下方式定义它们:

@Repository
@Transactional
public class XxxDao {
    @Autowired
    private EntityManager entityManager;

    private Session getSession() {
        return entityManager.unwrap(Session.class);
    }
...
}

【讨论】:

  • 对我来说(使用休眠 5.5)它仅适用于 spring.jpa.mapping-resources 属性。将文件放入 src/main/resources 而不在属性中列出它们是行不通的。
【解决方案2】:
@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;
}

【讨论】:

  • 此代码无法编译。 sessionFactory() 没有返回任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2020-12-18
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多