Java SpringBoot冲突数据库配置
我想用SpringBoot创建一个MVC应用程序。当我启动主页时一切正常,但当我要求我的控制器从我的数据库获取数据(使用Hibernate配置)时,我出现以下错误: 无法将org.springframework.orm.hibernate5.SessionHolder转换为org.springframework.orm.jpa.EntityManagerHolder 我不明白为什么SpringBoot试图将Hibernate会话持有者转换为JPA会话持有者。 我的数据库配置是:Java SpringBoot冲突数据库配置,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我想用SpringBoot创建一个MVC应用程序。当我启动主页时一切正常,但当我要求我的控制器从我的数据库获取数据(使用Hibernate配置)时,我出现以下错误: 无法将org.springframework.orm.hibernate5.SessionHolder转换为org.springframework.orm.jpa.EntityManagerHolder 我不明白为什么SpringBoot试图将Hibernate会话持有者转换为JPA会话持有者。 我的数据库配置是: @Configu
@Configuration
@PropertySource("classpath:/META-INF/database.properties")
@EnableTransactionManagement
public class DatabaseConfig {
@Autowired
private Environment env;
// -- specifying destroyMethod="close" is not required. It's inferred by the
// Spring container.
@Bean(destroyMethod = "close")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("database.driverClassName"));
dataSource.setUrl(env.getProperty("database.url"));
dataSource.setUsername(env.getProperty("database.username"));
dataSource.setPassword(env.getProperty("database.password"));
return dataSource;
}
@Bean
public SessionFactory entityManagerFactory(DataSource dataSource) {
LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource);
// Packages Java to Scan
String[] arrPackages = new String[] { "home" };
builder.scanPackages(arrPackages);
return builder.buildSessionFactory();
}
@Bean public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
SpringBoot应用程序:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class }
)
public class AppWeb {
public static void main(String[] args) {
SpringApplication.run(AppWeb.class, args);
}
}
POM文件:
<modelVersion>4.0.0</modelVersion>
<groupId>FrankGroup</groupId>
<artifactId>FrankArtifact</artifactId>
<version>0.1.0</version>
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
<hibernate.version>5.2.12.Final</hibernate.version>
<mysql.version>5.1.18</mysql.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
hibernate.properties文件:
hibernate.show_sql=true
hibernate.id.new_generator_mappings=false
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.globally_quoted_identifiers=true
hibernate.hbm2ddl.auto=none
谢谢我不太清楚您为什么会出现这个确切的错误。首先,我将验证您的导入,以确保所有内容都是Hibernate 5导入。最后要检查的是,为了确保您没有混合使用Hibernate 4和Hibernate 5,请仔细检查您的项目依赖项以确保没有混合 然后,我将尝试将SessionFactorybean和TransactionManager bean的实现更改为以下内容。我怀疑您遇到了由LocalSessionFactoryBuilder创建的SessionFactory与EntityManagerFactory不兼容的情况。我知道最近有一项关于LocalSessionFactoryBean和HibernateTransactionManager的工作可供EntityManagerFactory使用 . 注:进口:
import org.hibernate.SessionFactory
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
...
etc
SessionFactorybean:
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) throws Exception {
LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
factoryBean.setPackagesToScan(new String[] { "home" });
factoryBean.setDataSource(dataSource);
SessionFactory sf = factoryBean.getObject();
return sf;
}
和交易经理
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
return transactionManager;
}
然后,您应该能够成功地将SessionFactory自动连接到DAO/存储库中,并从数据库中获取数据
@Autowired
private SessionFactory sessionFactory;
解决方案似乎将sessionFactory和entityManagerFactory的bean从@Configuration类(DatabaseConfig)中分离出来。
SpringBoot会自动生成它们。可能与我的配置相同(请参阅AppWeb类),但错误相同。请检查您的依赖关系-您是否明确添加了hibernate JAR?根据您的建议,我已将依赖关系添加到pom.xml中,但同样的错误是:org.springframeworkspringormorg.hibernatehibernate core5.2.12.Final嗨。Hibernate.version是5.3.3.Final。我的存储库是公共接口SpitterRepository扩展了分页和排序存储库{//Spitter save(Spitter Spitter);Spitter findByUsername(字符串用户名);}。。现在错误是:Controller需要一个名为“entityManagerFactory”的bean,但找不到该bean。也许分页和排序存储库仅适用于JPA?谢谢。是的,Spring数据存储库需要一个JPATransactionManager和一个entityManagerFactory。你有一些选择,这取决于你想要完成什么。1) 完全切换到JPA 2)添加JPA事务管理器和hibernate事务管理器并按名称引用3)配置JPA事务管理器并从JPA实体管理器中展开hibernate会话(如果需要直接使用它)。让我知道你想走哪条路,如果需要的话,我可以提供帮助。第二种解决方案似乎是最明智的:)谢谢你需要帮助吗?或者你有一个好主意如何完成?我可以试试,但如果你有一个快速的解决方案更好:)谢谢
@Autowired
private SessionFactory sessionFactory;