2017-08-26 15 views
2

私は、ThymeleafとHibernateを使用してIntelliJでSpringブートWebアプリケーションを作成しました。私はすべてのdb接続を作成することができ、それはうまく動作しています。私が見た限りでは、SessionfactoryをBeanにして、dbアクションを実行するすべてのサービスクラスでautowireするのは良い方法です。Spring Boot/Thymeleaf/Hibernate:Sessionfactory Bean with Java Annotations

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()); 
    } 
} 

質問:

私はこのようになり、設定ファイルとしてSpringMvcConfigurationを持って、私は多くのことを試してみたが、私は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> 

乾杯はMaik

ソリューション:

  1. 下に述べたように、私は私が

    01を追加する必要がありました豆を追加する必要が私のpom.xml

  2. から

    org.springframeworkばねORM 4.3.10.RELEASE @SpringBootApplication後、私は

    @EnableAutoConfigurationを追加しなければならなかった(= {HibernateJpaAutoConfiguration.class}を除外する)

答えて

3

スプリングブートを使用しているので、データベース構成にXMLの設定を使用する必要があります。私は、PostgreSQLデータベースを使用していた上記データベースの設定では

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

:Hibernateで春ブーツを統合するには、このようなLocalSessionFactoryBeanDataSourceHibernateTransactionManagerPersistenceExceptionTranslationPostProcessor Beanを作成する必要があります。あなたはそれを使用するためには何をインポートしました....

@Autowired 
SessionFactory sessionFactory; 
+0

あなたの依存関係や他のモジュールをインポートして、この例を動作させることができますか?私の場合、LocalSessionFactoryBean、DriverManagerDataSource、HibernateTransactionManager、PersistenceExceptionTranslationPostProcessorを解決することはできません... – Barzille

+0

And:これを余分なクラスに入れる必要がありますか?あなたはDatabaseConfigの下に置いていますが、私は現在のところ、publicクラスSpringMvcConfigurationだけがWebMvcConfigurerAdapterを継承しています。私は私のpom.xmlに\t \t \t \t \t org.springframework \t \t \t 春-ORM \t \t \t 4.3.10.RELEASE \t \tを追加した後 – Barzille

+0

は、モジュールは罰金解決。しかし、autowireを追加した後、次のエラーが発生します。org.springframework.orm.jpa.EntityManagerHolderはorg.springframework.orm.hibernate5.SessionHolderにキャストできません。ここで何が助けられるのか考えていますか? – Barzille

0

この例は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; 
    } 
+0

この例では、それはのBasicDataSourceを解決することはできません。SessionFactoryのインスタンスを取得するには

はこのようSessionFactoryインタフェースをautowire? – Barzille

+0

提供されたリンクを読んだことがありますか?私はそうは思わない。それぞれのステップで他の人の助けを期待しないでください。 –

0

これを試しましたか?

@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; 
} 
+0

この例では、org.springframework.orm.hibernate5のBasicDataSourceとormを解決できません。使用するために何をインポートしましたか? – Barzille

+0

私は、spring-ormをアーティファクトとしてpom.xmlに追加することで、ワームパッケージを解決しました。しかし、BasicDataSourceはまだ利用できません。 – Barzille

関連する問題