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

Posted

技术标签:

【中文标题】Spring Boot / Thymeleaf / Hibernate:带有 Java 注解的 Sessionfactory Bean【英文标题】:Spring Boot / Thymeleaf / Hibernate: Sessionfactory Bean with Java Annotations 【发布时间】:2018-02-04 05:46:31 【问题描述】:

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

我有一个 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 和数据源还是必须在 application.properties 中或仅在 hibernate.cfg.xml 中,目前看起来像这样:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://localhost:3306/family_kurse</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">username</property>
        <property name="connection.password">secret</property>

        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <mapping class="eu.barz.familykurse.domain.Leader"/>
        <mapping class="eu.barz.familykurse.domain.Course"/>

        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

干杯迈克

解决方案:

    我需要添加下面提到的 bean

    我必须添加

    org.springframework 弹簧 4.3.10.发布 到我的 pom.xml

    @SpringBootApplication 之后我必须添加

    @EnableAutoConfiguration(排除 = HibernateJpaAutoConfiguration.class)

【问题讨论】:

【参考方案1】:

由于您使用的是 Spring Boot,因此您应该为您的数据库配置使用无 XML 配置。要将 Spring Boot 与 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;

【讨论】:

您能告诉我您的依赖项或您导入的其他模块以使此示例正常工作吗?就我而言,它无法解析 LocalSessionFactoryBean、DriverManagerDataSource、HibernateTransactionManager 和 PersistenceExceptionTranslationPostProcessor... 还有:我需要把它放在额外的课程中吗?你把它放在DatabaseConfig下,我目前只有公共类SpringMvcConfiguration extends WebMvcConfigurerAdapter。 我添加后 org.springframeworkspring-orm4.3.10.RELEASE在我的 pom.xml 中,模块解析得很好。但添加自动装配后,我收到以下错误:org.springframework.orm.jpa.EntityManagerHolder 无法转换为 org.springframework.orm.hibernate5.SessionHolder。您知道什么可以在这里提供帮助吗? 经过一番研究,我终于得到了它。我必须在我的 SpringApplication 中添加一个排除项。我在上面更新了我的帖子。 抱歉回复晚了。您必须包括休眠依赖&lt;dependency&gt; &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;5.2.10.Final&lt;/version&gt; &lt;/dependency&gt; 或 spring-data-jpa 依赖&lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt; &lt;/dependency&gt;【参考方案2】:

这个例子来自here。

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

【讨论】:

在这个例子中它不能解析 BasicDataSource.... 你导入了什么来使用它? 您阅读了提供的链接吗?我不这么认为。不要期望别人在每一步都提供帮助。 新版本带有 spring boot + hibernate 5。使用 Spring 引导 Hibernate 5 baeldung.com/hibernate-5-spring github: github.com/eugenp/tutorials/tree/master/persistence-modules/…【参考方案3】:

你试过了吗?

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

【讨论】:

在这个例子中,它无法解析 org.springframework.orm.hibernate5 中的 BasicDataSource 和 orm.... 你导入了什么来使用它? 我设法通过将 spring-orm 作为工件添加到 pom.xml 来解决蠕虫包。但是 BasicDataSource 仍然不可用。

以上是关于Spring Boot / Thymeleaf / Hibernate:带有 Java 注解的 Sessionfactory Bean的主要内容,如果未能解决你的问题,请参考以下文章

spring boot整合Thymeleaf

Spring Boot2:使用Spring Boot结合Thymeleaf模板引擎使用总结

Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

Spring Boot 学习笔记--整合Thymeleaf

Spring Boot入门——thymeleaf模板使用

Spring Boot模板引擎Thymeleaf demo