解决方案:
/**
* 自定义数据源
**/
@Bean(name = "customDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.hikari.custom")
public HikariDataSource customDataSource() {
return new HikariDataSource();
}
/**
* 配置 组合jpaProperties和hibernateProperties配置的map对象
* @return 组合jpaProperties和hibernateProperties配置的map
*/
@Bean
public Map<String, Object> vendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
/**
* 配置数据源实体管理器
*
* @param builder EntityManagerFactoryBuilder
* @return EntityManager
*/
@Bean(name = "customEntityManager")
@Primary
public EntityManager entityManagerReport(EntityManagerFactoryBuilder builder) {
return builder.dataSource(customDataSource)
//指定组合jpaProperties和hibernateProperties配置的map对象
.properties(vendorProperties)
//指定该数据源的实体类所在包路径
.packages("com.j5code.entity")
.persistenceUnit("persistenceUnit")
.build().getObject().createEntityManager();
}
/**
* 配置JPAQueryFactory
**/
@Bean(name = "customJPAQueryFactory")
public JPAQueryFactory jpaQueryFactory(@Qualifier("customEntityManager") EntityManager entityManager) {
return new JPAQueryFactory(() -> {
Session session = entityManager.unwrap(Session.class);
try {
//执行mysql验证数据连接语句
session.createSQLQuery("SELECT 1").uniqueResult();
return session;
} catch (Exception e) {
LOGGER.error("查询数据库出错,数据库连接存在问题:{}", e.getMessage());
Connection disconnect = session.disconnect();
if (Objects.nonNull(disconnect)) {
try {
disconnect.close();
} catch (SQLException ex) {
LOGGER.error("连接关闭异常:{}", ex.getMessage());
}
}
}
return entityManager.unwrap(Session.class);
});
}