2016-04-20 4 views
0

Helouprocurations de printemps ne gère pas @Transactional

Je suis en train de configurer Hibernate pour le développement local avec la base de données HSQL, mais je suis bloqué sur les transactions de manutention Spring pas du tout.

Configuration de source de données, sessionFactory, etc ...

package com.globesy.hcp.context.config; 

import java.io.IOException; 
import java.util.Properties; 

import javax.sql.DataSource; 

import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistry; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.DependsOn; 
import org.springframework.core.env.Environment; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder; 
import org.springframework.orm.hibernate5.HibernateTransactionManager; 
import org.springframework.transaction.interceptor.TransactionInterceptor; 

import com.globesy.hcp.context.config.constants.BeanConstants; 
import com.globesy.hcp.context.config.constants.PropertyConstants; 

@Configuration 
public class DataSourceConfig { 

    private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceConfig.class); 

    @Autowired 
    private Environment environment; 

    @Bean(name=BeanConstants.SESSION_FACTORY_BEAN_NAME) 
    @DependsOn(BeanConstants.DATASOURCE_BEAN_NAME) 
    public SessionFactory sessionFactory(@Qualifier(BeanConstants.DATASOURCE_BEAN_NAME) DataSource dataSource) throws IOException { 
     org.hibernate.cfg.Configuration hibernateConfig = new org.hibernate.cfg.Configuration() 
       .addProperties(hibernateProperties()); 

     StandardServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(hibernateConfig.getProperties()).build(); 

     return new LocalSessionFactoryBuilder(dataSource) 
       .scanPackages(PropertyConstants.HIBERNATE_PACKAGES_TO_SCAN) 
       .setProperties(hibernateConfig.getProperties()) 
       .buildSessionFactory(registry); 
    } 

    @Bean(name=BeanConstants.DATASOURCE_BEAN_NAME) 
    public DataSource dataSource(){ 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty(PropertyConstants.HIBERNATE_DRIVER_CLASS_NAME)); 
     dataSource.setUrl(environment.getRequiredProperty(PropertyConstants.HIBERNATE_URL)); 
     dataSource.setUsername(environment.getRequiredProperty(PropertyConstants.HIBERNATE_USERNAME)); 
     dataSource.setPassword(environment.getRequiredProperty(PropertyConstants.HIBERNATE_PASSWORD)); 

     LOGGER.info("DataSource initialized"); 
     return dataSource; 
    } 

    @Bean(name=BeanConstants.TRANSACTION_MANAGER) 
    @DependsOn({BeanConstants.SESSION_FACTORY_BEAN_NAME,BeanConstants.DATASOURCE_BEAN_NAME}) 
    public HibernateTransactionManager transactionManager(@Qualifier(BeanConstants.SESSION_FACTORY_BEAN_NAME) SessionFactory sessionFactory, 
                  @Qualifier(BeanConstants.DATASOURCE_BEAN_NAME) DataSource source) { 

     HibernateTransactionManager manager = new HibernateTransactionManager(); 

     manager.setDataSource(source); 
     manager.setSessionFactory(sessionFactory); 
     manager.setEntityInterceptorBeanName(BeanConstants.TRANSACTION_INTERCEPTOR); 
     manager.setRollbackOnCommitFailure(true); 
     manager.afterPropertiesSet(); 

     LOGGER.info("HibernateTransactionManager initialized"); 
     return manager; 
    } 

    @Bean(name=BeanConstants.TRANSACTION_INTERCEPTOR) 
    public TransactionInterceptor transactionInterceptor(){ 

     Properties props = new Properties(); 
     props.put("save", "PROPAGATION_REQUIRED"); 

     TransactionInterceptor interceptor = new TransactionInterceptor(); 
     interceptor.setTransactionAttributes(props); 

     return interceptor; 
    } 

    private Properties hibernateProperties() { 
      Properties properties = new Properties(); 
      properties.put(PropertyConstants.HIBERNATE_DIALECT, environment.getRequiredProperty(PropertyConstants.HIBERNATE_DIALECT)); 
      properties.put(PropertyConstants.HIBERNATE_DRIVER_CLASS_NAME, environment.getRequiredProperty(PropertyConstants.HIBERNATE_DRIVER_CLASS_NAME)); 
      properties.put(PropertyConstants.HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PropertyConstants.HIBERNATE_SHOW_SQL)); 
      properties.put(PropertyConstants.HIBERNATE_URL, environment.getRequiredProperty(PropertyConstants.HIBERNATE_URL)); 
      properties.put(PropertyConstants.HIBERNATE_USERNAME, environment.getRequiredProperty(PropertyConstants.HIBERNATE_USERNAME)); 
      properties.put(PropertyConstants.HIBERNATE_PASSWORD, environment.getRequiredProperty(PropertyConstants.HIBERNATE_PASSWORD)); 
      properties.put(PropertyConstants.HIBERNATE_HBM2DLL_AUTO, environment.getRequiredProperty(PropertyConstants.HIBERNATE_HBM2DLL_AUTO)); 
      properties.put(PropertyConstants.HIBERNATE_DEFAULT_SCHEMA, environment.getRequiredProperty(PropertyConstants.HIBERNATE_DEFAULT_SCHEMA)); 

      return properties;   
    } 
} 

fichier Propriété avec configuration de mise en veille prolongée pour l'environnement local

#hibernate config 
hibernate.connection.driverClassName=org.hsqldb.jdbcDriver 
hibernate.connection.url=jdbc:hsqldb:hsql://localhost:9001/hcp_demo 
hibernate.default_schema=public 
hibernate.connection.username=sa 
hibernate.connection.password= 
hibernate.dialect=org.hibernate.dialect.HSQLDialect 
hibernate.show_sql=true 
hibernate.hbm2dll.auto=update 

point de Code throws Exception invocation qui

@RestController 
public class VerifyController { 

    @Autowired 
    private PersonDao personDao; 

    private static final Logger LOGGER = LoggerFactory.getLogger(VerifyController.class); 

    @PostConstruct 
    @Transactional 
    public void init(){ 
     Person person = new Person(); 

     person.setFirstName("Jozef"); 
     person.setSurname("Novak"); 

     personDao.saveOrUpdate(person); 
    } 

... 

Stacktrace imprimé après l'appel personneDao.saveOrU pdate()

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'verifyController': Invocation of init method failed; nested exception is org.hibernate.HibernateException: No CurrentSessionContext configured! 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5066) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1572) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1562) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.hibernate.HibernateException: No CurrentSessionContext configured! 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:685) 
    at com.globesy.hcp.dao.AbstractDao.getSession(AbstractDao.java:13) 
    at com.globesy.hcp.dao.AbstractDao.saveOrUpdate(AbstractDao.java:25) 
    at com.globesy.hcp.controller.VerifyController.init(VerifyController.java:34) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:354) 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:305) 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133) 
    ... 23 more 

Ce que j'ai essayé allready

  • Commutation entre HibernateTransactionManager/DatasourceTransactionManager
  • Propriété - hibernate.current_session_context_class avec des valeurs (gérées, fil)
  • Et beaucoup autres petits changements de configuration

J'espère que vous avez des connaissances sur ce qui peut être mal avec cette configuration, parce que moi-même et Google ne l'avons pas.

+0

Je crois que vous ne pouvez pas utiliser Transactional dans PostConstruct –

Répondre