2017-02-22 2 views
1

Meine letzte Ziel ist es, eine Spring-Boot-Anwendung zu erstellen, aber ohne XML-Konfigurationsdateien (oder so wenig wie möglich), also möchte ich einige XML-Dateien (zB web.xml) vermeiden einige Bean-Definitionsteile.Hibernate SessionFactory Annotation-basierte Konfiguration

Und hier kommt härterer Teil.

Ich mag eine Sessionbohne in Klassen mit @Autowired Anmerkung injizieren, aber jedes Mal wenn ich versuche Anwendung zu starten erhalte ich:

org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler mit dem Namen Erstellen Bean ' temperatureController ': Unzufriedene Abhängigkeit ausgedrückt durch Feld' sessionFactory '; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen einer Bean mit dem Namen 'sessionFactory': FactoryBean hat eine Exception bei der Objekterstellung ausgelöst; verschachtelte Ausnahme ist java.lang.IllegalStateException: EntityManagerFactory nicht null sein muss

Ok, ich verstehe, dass Frühling keine Sessionbohne hat, weil es keine EntityManagerFactory hat.

Also ich würde alle Vorschläge, wie Sie das lösen können, aber nur mit der Konfiguration durch Anmerkungen schätzen.

Bisher hat ich gelesen ähnlichen Beitrag Mine über eine Bohne auf diese Weise in @Configuration Klasse angeben:

@Bean 
public HibernateJpaSessionFactoryBean sessionFactory() { 
    return new HibernateJpaSessionFactoryBean(); 
} 

Und dann das Hinzufügen dieser Zeile in Properties-Datei:

spring.jpa.properties .hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext

Und schließlich @Autowired mit Session sollte gut funktionieren. Aber natürlich funktioniert es nicht.

Irgendwelche Ideen was soll ich anders/besser machen?

ist Meine Eigenschaften Datei sehr einfach:

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-structure = org.hibernate.cfg.Imp rovedNamingStrategy spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext

Antwort

2

Normalerweise, wenn ich einfach etwas definieren wollen mache ich eine Klasse, die die folgenden ähnelt:

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

} 

von @EnableTransactionManagement verwenden und eine Bohne von Art zu schaffen LocalSessionFactoryBean, Frühling wird automatisch ein SessionFactory erstellen Bean für Sie, die Sie überall injizieren/autowire können.

Natürlich können Sie bei Bedarf eine Konfiguration aus Eigenschaftsdateien einfügen.

Verwandte Themen