2016-04-20 9 views
0

HelouFrühling Proxies Handhabung nicht @Transactional

Ich versuche, mit HSQL Datenbank für die lokale Entwicklung Hibernate zu konfigurieren, aber ich bin fest auf Frühling keine Transaktionen überhaupt handhaben.

Konfiguration der Datenquelle, session, 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;   
    } 
} 

Immobilien mit Hibernate-Konfiguration für lokale Umgebung Datei

#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 

Invocation Punkt Code, der Exception

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

... 

wirft Stacktrace gedruckt nach dem Aufruf personDao.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 

Was ich allready

  • Umschalten zwischen HibernateTransactionManager/DatasourceTransactionManager
  • Property versucht haben - hibernate.current_session_context_class mit Werten (verwaltet, Gewinde)
  • Und viele andere kleine Konfigurationsänderungen

Ich hoffe, Sie haben etwas wissen, was kann falsch mit dieser Konfiguration sein, weil ich und Google nicht haben.

+0

Ich glaube, dass Sie Transactional in PostConstruct nicht verwenden können –

Antwort

Verwandte Themen