如何禁用spring boot HibernateJpaAutoConfiguration

Posted

技术标签:

【中文标题】如何禁用spring boot HibernateJpaAutoConfiguration【英文标题】:how to disable spring boot HibernateJpaAutoConfiguration 【发布时间】:2016-09-27 13:15:41 【问题描述】:

我有一个依赖于项目 B 的 spring boot 项目 A。 项目 B 有一些 .hbm.xml 资源。 在项目 A 中更改休眠配置我添加 DatabaseConfiguration @Configuration 更改 sessionFactory

@Bean
public LocalSessionFactoryBean sessionFactory() 
    LocalSessionFactoryBean sessionFactoryBean = new  LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setMappingLocations("classpath*:hibernate/**/*.hbm.xml");
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
    hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);

    return sessionFactoryBean;

build.gradle 有这个依赖 HibernateJpaAutoConfiguration 运行

compile 'org.springframework.boot:spring-boot-starter-data-jpa'

当我在 gradle bootRun 或 maven spring-boot:run 中运行应用程序时 应用程序启动并正常,但是当我在 java -jar 中运行时 我得到异常

  caused by: org.springframework.beans.factory.BeanCreationException: 
  Error creating bean with name 'entityManagerFactory' defined in class path 
 resource    [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: 
 Invocation of init method failed; nested exception is org.hibernate.MappingException: 
An association from the table core_organization_Structure refers to an unmapped class: org.roshan.framework.domain.security.User

我不知道为什么 HibernateJpaAutoConfiguration 启动??? 之后我将 Application.java 更改为喜欢这个以排除它但再次不起作用。当我将 hbm 复制到 projectA .project A 运行并确定(使用 java -jar)

@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class )

更新

经过搜索和测试,我发现了问题并解决了这个问题。问题的原因是在项目中使用了 hibernate-entitymanager 依赖项。spring 启动执行器检测到这个并自动配置实体管理器。删除这个依赖项后禁用 HibernateJpaAutoConfiguration 工作正确:D

【问题讨论】:

是什么让您认为您需要一个普通的SessionFactory 才能使用hbm.xml 文件?这些与实体经理一起工作得很好(通常也会被选中)。因此,不要使事情复杂化,只需使用 JPA。我觉得很奇怪你没有得到 bootRun 错误(虽然我想我知道为什么,因为它正确配置了 JPA 实体管理器并且你打包的 jar 由于无法读取你的 hbm 文件而失败)。 我有很多 hbm 无法迁移到 jpa。为什么 HibernateJpaAutoConfiguration exclude 不起作用? 请阅读。您拥有 HBM 文件这一事实并不意味着您不能使用 JPA。注释或 xml 都必须为您的实体映射,对于基于 Hibernate 的 JPA 提供程序,它可以同时使用两者。因此,只需使用 JPA,只需使用实体管理器,它将与 HBM 文件一起使用。 是的,我想知道你在说什么。我想使用 SessionFactory 并忽略 HibernateJpaAutoConfiguration?我该怎么做? .并且不知道为什么在““java - jar”应用程序中不感知 jar 依赖项中的 hbm ?? 但是当在项目中复制 hbm 时应用程序启动正常???? 然后排除自动配置。但是为什么要使用会话工厂呢?通过EntityManager,它给了你什么? 【参考方案1】:

在搜索和测试之后,我发现了问题,问题的原因是在项目中使用了 hibernate-entitymanager 依赖项。spring boot actuator 检测到这个并自动配置实体管理器。删除这个依赖项后禁用 HibernateJpaAutoConfiguration 工作正确:D

【讨论】:

删除了哪些依赖项? :)【参考方案2】:

试试这个禁用数据源自动配置:

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)
public class MyConfiguration 

【讨论】:

以上是关于如何禁用spring boot HibernateJpaAutoConfiguration的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 Hibernate 和 Spring Boot 配置和监控 HikariCP

如何在 Spring-Boot 2 中禁用安全性? [复制]

grails 3(spring-boot) - 如何配置hibernate二级缓存

Spring Boot - 如何在开发过程中禁用@Cacheable?

如何禁用spring boot HibernateJpaAutoConfiguration