基于Hibernate SessionFactory注解的配置

基于Hibernate SessionFactory注解的配置

问题描述:

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

这里来了更难的部分。

我想用@Autowired注解一个SessionFactory Bean注入类注入,但每次我尝试启动应用程序,我得到:

org.springframework.beans.factory.UnsatisfiedDependencyException:错误创建名称为豆“ temperatureController':通过字段'sessionFactory'表示的不满足的依赖性;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称'sessionFactory'创建bean时出错:FactoryBean在创建对象时抛出异常;嵌套的例外是java.lang.IllegalStateException:EntityManagerFactory的不能为空

好吧,我明白,春天没有SessionFactory的豆,因为它没有任何的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 =真 spring.datasource.password = mysql的 spring.datasource.username = mysql的 spring.datasource.testWhileIdle =真 spring.jpa.hibernate.ddl-AUTO =更新 spring.datasource.validationQuery = SELECT 1个 spring.datasource.url = JDBC:MySQL的://本地主机:3306/SYS spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.Imp rovedNamingStrategy spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate4。SpringSessionContext

通常当我要定义简单的东西我做一类是类似于以下内容:

@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类型的豆,弹簧会自动创建一个SessionFactory为你的bean,你可以在任何地方注入/ autowire。

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