Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBoot冲突数据库配置_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java SpringBoot冲突数据库配置

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

我想用SpringBoot创建一个MVC应用程序。当我启动主页时一切正常,但当我要求我的控制器从我的数据库获取数据(使用Hibernate配置)时,我出现以下错误: 无法将org.springframework.orm.hibernate5.SessionHolder转换为org.springframework.orm.jpa.EntityManagerHolder

我不明白为什么SpringBoot试图将Hibernate会话持有者转换为JPA会话持有者。 我的数据库配置是:

@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.springframework
springorm

org.hibernate
hibernate core
5.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;