Spring Boot / Thymeleaf / Hibernate:带有Java注释的Sessionfactory Bean

我使用Thymeleaf和Hibernate创建了一个带有IntelliJ的Spring Boot Web应用程序。 我到目前为止,我可以创建所有数据库连接,它工作正常。 据我所知,将Sessionfactory作为bean并在所有执行db操作的Service Classes中自动assembly它是一种好方法。

我有一个SpringMvcConfiguration作为配置文件,如下所示:

package eu.barz.familykurse.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Locale; @Configuration public class SpringMvcConfiguration extends WebMvcConfigurerAdapter{ @Bean public LocaleResolver localeResolver(){ SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); sessionLocaleResolver.setDefaultLocale(Locale.GERMAN); return sessionLocaleResolver; } @Bean LocaleChangeInterceptor localeChangeInterceptor(){ LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("lang"); return localeChangeInterceptor; } @Override public void addInterceptors(InterceptorRegistry interceptorRegistry){ interceptorRegistry.addInterceptor(localeChangeInterceptor()); } } 

问题:我已经尝试了很多,但我找不到为SessionFactory声明bean的解决方案。

任何提示都会非常有用。 我应该在这里声明一个sessionfactory和datasource,还是必须在application.properties中,或者只在hibernate.cfg.xml中,它看起来像这样:

     jdbc:mysql://localhost:3306/family_kurse com.mysql.jdbc.Driver username secret org.hibernate.dialect.MySQL5Dialect thread true    <!-- update -->   

干杯麦克

解:

  1. 我需要添加如下所述的bean

  2. 我不得不补充一下

    org.springframework spring-orm 4.3.10.RELEASE到我的pom.xml

  3. 在@SpringBootApplication之后我不得不添加

    @EnableAutoConfiguration(exclude = {HibernateJpaAutoConfiguration.class})

由于您使用的是spring boot,因此您应该使用XML free配置进行数据库配置。 要将spring引导与hibernate集成,您需要创建LocalSessionFactoryBeanDataSourceHibernateTransactionManagerPersistenceExceptionTranslationPostProcessor bean,如下所示:

 @Configuration public class DatabaseConfig { @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); sessionFactory.setPackagesToScan("com.example.model"); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.postgresql.Driver"); dataSource.setUrl("jdbc:postgresql://localhost:5432/testdb"); dataSource.setUsername("root"); dataSource.setPassword("root"); return dataSource; } @Bean @Autowired public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(sessionFactory); return txManager; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { return new PersistenceExceptionTranslationPostProcessor(); } Properties hibernateProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.ddl-auto", "update"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); return properties; } } 

在上面的数据库配置中我使用了postgreSQL数据库。

要像这样得到sessionFactory autowire SessionFactory接口的实例:

  @Autowired SessionFactory sessionFactory; 

我从这里开始就是这个例子。

 @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(restDataSource()); sessionFactory.setPackagesToScan( new String[] { "org.baeldung.spring.persistence.model" }); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public DataSource restDataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); dataSource.setUrl(env.getProperty("jdbc.url")); dataSource.setUsername(env.getProperty("jdbc.user")); dataSource.setPassword(env.getProperty("jdbc.pass")); return dataSource; } 

你试过这个吗?

 @Bean public org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory(){ org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory = new org.springframework.orm.hibernate5.LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); return sessionFactory; } @Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("jdbc.driverClassName"); dataSource.setUrl("jdbc.url"); dataSource.setUsername("jdbc.user"); dataSource.setPassword("jdbc.pass"); return dataSource; }