我最近的目标是构建一个spring boot应用程序,但没有任何XML配置文件(或尽可能少),所以我想避免使用某些XML文件(即web.xml),特别是对于某些bean定义部分。
这里有更强硬的部分。
我想使用@Autowired注释将SessionFactory bean注入到类中,但每次我尝试启动应用程序时都会得到:
org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为' temperatureController的bean时出错:通过字段' sessionFactory'表达的不满意的依赖性;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为' sessionFactory':FactoryBean的bean在创建对象时引发异常;嵌套异常是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
答案 0 :(得分: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,您可以在任何地方注入/自动装配。
当然,如果需要,您可以从属性文件中注入一些配置。