我将遗留应用程序迁移到Spring-boot并且必须集成一个名为hibernate的查询映射文件(以前在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的情况下以某种方式将hibernate映射文件(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 auto-config做同样的事情,那就欢迎了!
答案 0 :(得分: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;
}
答案 1 :(得分:0)
将* .hbm.xml文件放在src / main / resources文件夹下,Spring Boot可以自动扫描它们。
如果要在application.properties文件中指定位置,请将其定义为spring.jpa.mapping-resources属性。
src/main/resources/hibernate : Store all the *.hbm.xml files
src/main/resources/application.properties : define the spring boot properties
在SpringBoot 2.1.3中进行了测试,以下是文件夹结构
@Repository
@Transactional
public class XxxDao {
@Autowired
private EntityManager entityManager;
private Session getSession() {
return entityManager.unwrap(Session.class);
}
...
}
如果您想在Dao类中获得休眠会话,请按以下方式定义它们:
{{1}}