基于Hibernate SessionFactory注释的配置

问题描述 投票:1回答:1

我最近的目标是构建一个spring boot应用程序,但没有任何XML配置文件(或尽可能少),所以我想避免使用某些XML文件(即web.xml),特别是对于某些bean定义部分。

这里有更强硬的部分。

我想使用@Autowired注释将SessionFactory bean注入到类中,但每当我尝试启动应用程序时,我得到:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为'temperatureController'的bean时出错:通过字段'sessionFactory'表示的不满意的依赖关系;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'sessionFactory'的bean时出错:FactoryBean在创建对象时抛出异常;嵌套异常是java.lang.IllegalStateException:EntityManagerFactory不能为null

好的,我知道Spring没有SessionFactory bean,因为它没有EntityManagerFactory。

所以我很感激任何建议如何解决这个问题,但只能通过注释进行配置。

到目前为止,我阅读了类似的帖子,关于在@Configuration类中以这种方式指定bean:

@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
    return new HibernateJpaSessionFactoryBean();
}

然后将此行添加到属性文件中:

spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext

最后@Autowired与SessionFactory应该工作得很好。但是,对我来说当然不行。

任何想法我应该做什么不同/更好?

我的属性文件非常基本:

spring.jpa.show -sql = true spring.datasource.password = mysql spring.datasource.username = mysql spring.datasource.testWhileIdle = true spring.jpa.hibernate.ddl-auto = update spring.datasource.validationQuery = SELECT 1 spring .datasource.url = jdbc:mysql:// localhost:3306 / sys spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext

java spring hibernate spring-boot
1个回答
3
投票

通常当我想要定义一些简单的东西时,我创建一个类似于以下的类:

@Configuration
@EnableTransactionManagement
public class PersistanceJpaConfig {

    @Bean 
    public LocalSessionFactoryBean hibernateSessionFactory(DataSource dataSource) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPackagesToScan(new String[] { 
                  "my.entities.package" 
        });
        sessionFactory.setHibernateProperties(additionalProperties());

        return sessionFactory;
    }

    @Bean HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory);

        return transactionManager;
    }

   @Bean 
   public DataSource dataSource(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306");
      dataSource.setUsername("user");
      dataSource.setPassword("password");
      return dataSource;
   }

    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL57InnoDBDialect");
        return properties;
    }

}

通过使用@EnableTransactionManagement并创建一个类型为LocalSessionFactoryBean的bean,spring将自动为您创建一个SessionFactory bean,您可以在任何地方注入/自动装配。

当然,如果需要,您可以从属性文件中注入一些配置。

© www.soinside.com 2019 - 2024. All rights reserved.