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.
Je crois que vous ne pouvez pas utiliser Transactional dans PostConstruct –