2017-02-22 148 views
1

我最近的目標是構建一個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

回答

2

通常當我要定義簡單的東西我做一類是類似於以下內容:

@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。

如果需要,當然可以從屬性文件注入一些配置。